我试图用Table2中的值填充Table1,如果它们还不存在于Table1中。
Table1有一个UNIQUEIDENTIFIER约束,并指定了一个默认值NEWID()。
我是用SELECT DISTINCT语句从Table2中获取结果的,最后只是为我创建了一个视图。我先声明 没有重复值 在Table2View中。
我也尝试过将SELECT语句的结果下放到一个临时表,并在临时表上使用以下方法填充GUID NEWID()
并从那里把值拉过来。无论我尝试了什么,到目前为止都会产生同样的错误。
违反UNIQUE KEY约束'constraintname'。无法在对象'dbo.table1'中插入重复键。重复键值为NULL。
这里是表1的CREATE TO。
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
产生错误。
任何帮助都将是非常感激的。我已经谷歌这个问题到了疯狂的地步。
在SQL Server中,一个唯一的列只允许一个 NULL
值。 你似乎有多个 NULL
值,这就是问题所在。
你可以通过将约束条件替换为过滤后的索引来解决这个问题。
create unique index unq_table1_dataid
on (dataid)
where dataid is not null;
我不记得标准中是否有明确的规定 NULL
值用唯一的约束来处理。 数据库都是这样做的。 SQL本身是不一致的. . . NULL = NULL
在过滤时被当作false处理,但 NULL = NULL
做聚合的时候。
好巧不巧,我能够解决这个问题。我从GUID列中删除了主键,之后查询运行得很好。看来是想先提交NULL值再提交完整记录。运行查询后对表进行SELECT *,显示没有插入NULL值。天哪!