在插入到选择从语句中使用 NEWID() 填充 GUID 列将引发错误 (NULL) 值



如果表1中尚不存在表2中的值,我正在尝试使用表2中的值填充表1。

表 1 具有 UNIQUEIDENTIFIER 约束,并指定了默认值 NEWID((。

我使用 SELECT DISTINCT 语句从 Table2 中获取结果,最终只是创建了一个视图来为我执行此操作。我将预先声明 Table2View 中没有重复值

我还尝试将 SELECT 语句的结果拖放到临时表中,并使用NEWID()填充临时表上的 GUID 并从那里提取值。到目前为止,无论我尝试了什么都会产生相同的错误。

违反唯一键约束"约束名称"。无法在对象"dbo.table1"中插入重复的键。重复的键值为 NULL。

以下是表 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

我已经从INSERT本身运行了SELECT语句,没有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 值。好悲伤!

最新更新