在insert into select from语句中用newid()填充guid列会引发错误(null)值

a7qyws3x  于 2021-07-29  发布在  Java
关注(0)|答案(2)|浏览(535)

我试图用表2中的值填充表1,如果它们在表1中还不存在的话。
table1具有uniqueidentifier约束,并指定了newid()的默认值。
我使用SELECTDISTINCT语句从表2中获取结果,并最终为我创建了一个视图。我将预先声明table2view中没有重复的值。
我还尝试将select语句的结果放到临时表中,并使用 NEWID() 然后把数值从那里拉过来。不管我怎么做都会产生同样的错误。
违反唯一键约束“constraintname”。无法在对象“dbo.table1”中插入重复键。重复的键值为空。
下面是表1上的创建步骤:

  1. SET ANSI_NULLS ON
  2. GO
  3. SET QUOTED_IDENTIFIER ON
  4. GO
  5. CREATE TABLE [dbo].[Table1]
  6. (
  7. [UID] [uniqueidentifier] ROWGUIDCOL NOT NULL,
  8. [DataID] [varchar](10) NULL,
  9. [DataName] [varchar](100) NULL,
  10. [DataType] [varchar](10) NULL,
  11. [DateLastPopulated] [date] NULL,
  12. [LastAmount] [bigint] NULL,
  13. [DateRecordCreated] [datetime] NULL,
  14. [DateLastModified] [datetime] NULL,
  15. PRIMARY KEY CLUSTERED ([UID] ASC)
  16. WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
  17. IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY],
  18. UNIQUE NONCLUSTERED ([DataID] ASC)
  19. WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
  20. IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
  21. ) ON [PRIMARY]
  22. GO
  23. ALTER TABLE [dbo].[Table1]
  24. ADD CONSTRAINT [DF_Table1_UID] DEFAULT (NEWID()) FOR [UID]
  25. GO
  26. ALTER TABLE [dbo].[Table1]
  27. ADD CONSTRAINT [CNST_Table1_CreateDate] DEFAULT (GETDATE()) FOR [DateRecordCreated]
  28. GO
  29. ALTER TABLE [dbo].[Table1] WITH CHECK
  30. ADD CONSTRAINT [FK_Table1_ForeignTable]
  31. FOREIGN KEY([ForeignID]) REFERENCES [dbo].[ForeignTable] ([ForeignID])
  32. GO
  33. ALTER TABLE [dbo].[Table1] CHECK CONSTRAINT [FK_Table1_ForeignTable]
  34. GO

下面是我正在运行的用于填充表的查询:

  1. INSERT INTO [dbo].[Table1] ([UID], DataName, DateLastPopulated, LastAmount)
  2. SELECT NEWID(), B.DataName, B.DateLastPopulated, B.LastAmount
  3. FROM [dbo].[Table2_View] B
  4. LEFT JOIN [dbo].[Table1] A ON B.DataName = A.DataName
  5. WHERE A.DataName IS NULL

我已经跑了 SELECT 政府的声明 INSERT 它本身就没有 NULL 值,并且没有重复的值。查询运行正常 NEWID() 填充guid。
但是,添加 SELECT 对…的陈述 INSERT INTO 产生错误。
任何帮助都将不胜感激。我在谷歌上搜索了这个问题,简直疯了。

e4eetjau

e4eetjau1#

sql server中的唯一列只允许一个 NULL 价值观。你好像有多个 NULL 价值观,这就是问题所在。
可以通过将约束替换为筛选索引来解决此问题:

  1. create unique index unq_table1_dataid
  2. on (dataid)
  3. where dataid is not null;

我不记得标准是否真的规定了 NULL 值使用唯一约束进行处理。数据库是双向的。sql本身不一致。 NULL = NULL 过滤时被视为false,但是 NULL = NULL 进行聚合时。

w51jfk4q

w51jfk4q2#

巧合的是,我能解决这个问题。我从guid列中删除了主键,然后查询就可以正常运行了。它似乎是在提交完整记录之前尝试提交空值。在运行查询之后,对表执行select*操作将显示没有插入空值。好悲伤!

相关问题