我试图用表2中的值填充表1,如果它们在表1中还不存在的话。
table1具有uniqueidentifier约束,并指定了newid()的默认值。
我使用SELECTDISTINCT语句从表2中获取结果,并最终为我创建了一个视图。我将预先声明table2view中没有重复的值。
我还尝试将select语句的结果放到临时表中,并使用 NEWID()
然后把数值从那里拉过来。不管我怎么做都会产生同样的错误。
违反唯一键约束“constraintname”。无法在对象“dbo.table1”中插入重复键。重复的键值为空。
下面是表1上的创建步骤:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Table1]
(
[UID] [uniqueidentifier] ROWGUIDCOL NOT NULL,
[DataID] [varchar](10) NULL,
[DataName] [varchar](100) NULL,
[DataType] [varchar](10) NULL,
[DateLastPopulated] [date] NULL,
[LastAmount] [bigint] NULL,
[DateRecordCreated] [datetime] NULL,
[DateLastModified] [datetime] NULL,
PRIMARY KEY CLUSTERED ([UID] ASC)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY],
UNIQUE NONCLUSTERED ([DataID] ASC)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[Table1]
ADD CONSTRAINT [DF_Table1_UID] DEFAULT (NEWID()) FOR [UID]
GO
ALTER TABLE [dbo].[Table1]
ADD CONSTRAINT [CNST_Table1_CreateDate] DEFAULT (GETDATE()) FOR [DateRecordCreated]
GO
ALTER TABLE [dbo].[Table1] WITH CHECK
ADD CONSTRAINT [FK_Table1_ForeignTable]
FOREIGN KEY([ForeignID]) REFERENCES [dbo].[ForeignTable] ([ForeignID])
GO
ALTER TABLE [dbo].[Table1] CHECK CONSTRAINT [FK_Table1_ForeignTable]
GO
下面是我正在运行的用于填充表的查询:
INSERT INTO [dbo].[Table1] ([UID], DataName, DateLastPopulated, LastAmount)
SELECT NEWID(), B.DataName, B.DateLastPopulated, B.LastAmount
FROM [dbo].[Table2_View] B
LEFT JOIN [dbo].[Table1] A ON B.DataName = A.DataName
WHERE A.DataName IS NULL
我已经跑了 SELECT
政府的声明 INSERT
它本身就没有 NULL
值,并且没有重复的值。查询运行正常 NEWID()
填充guid。
但是,添加 SELECT
对…的陈述 INSERT INTO
产生错误。
任何帮助都将不胜感激。我在谷歌上搜索了这个问题,简直疯了。
2条答案
按热度按时间e4eetjau1#
sql server中的唯一列只允许一个
NULL
价值观。你好像有多个NULL
价值观,这就是问题所在。可以通过将约束替换为筛选索引来解决此问题:
我不记得标准是否真的规定了
NULL
值使用唯一约束进行处理。数据库是双向的。sql本身不一致。NULL = NULL
过滤时被视为false,但是NULL = NULL
进行聚合时。w51jfk4q2#
巧合的是,我能解决这个问题。我从guid列中删除了主键,然后查询就可以正常运行了。它似乎是在提交完整记录之前尝试提交空值。在运行查询之后,对表执行select*操作将显示没有插入空值。好悲伤!