在 INSERT INTO SELECT FROM 语句中使用 NEWID() 填充 GUID 列会引发错误 (NULL) 值
Populating GUID column with NEWID() in an INSERT INTO SELECT FROM statement is throwing an error (NULL) value
如果表 1 中不存在表 2 中的值,我将尝试用这些值填充表 1。
表 1 具有 UNIQUEIDENTIFIER 约束并指定了默认值 NEWID()。
我使用 SELECT DISTINCT 语句从 Table2 中获取结果,并最终创建了一个视图来为我执行此操作。我会预先声明 Table2View 中没有重复值。
我还尝试将 SELECT 语句的结果放入临时 table 并使用 NEWID()
在临时 table 上填充 GUID 并拉那里的价值观。到目前为止,无论我尝试过什么都会产生相同的错误。
Violation of UNIQUE KEY constraint 'constraintname'. Cannot insert duplicate key in object 'dbo.table1'. The duplicate key value is 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
这是我的查询 运行 填充 table:
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 服务器中的唯一列只允许一个 NULL
值。您似乎有多个 NULL
值,这就是问题所在。
您可以通过用过滤索引替换约束来解决此问题:
create unique index unq_table1_dataid
on (dataid)
where dataid is not null;
我不记得该标准是否实际指定了如何使用唯一约束处理 NULL
值。数据库是双向的。 SQL本身就是不一致的。 . . NULL = NULL
过滤时被视为 false,但聚合时 NULL = NULL
被视为 false。
好巧,我解决了这个问题。我从 GUID 列中删除了主键,之后查询 运行 就好了。似乎它试图在提交完整记录之前提交 NULL 值。在 运行 之后对 table 执行 SELECT * 查询显示没有插入 NULL 值。天啊!
如果表 1 中不存在表 2 中的值,我将尝试用这些值填充表 1。
表 1 具有 UNIQUEIDENTIFIER 约束并指定了默认值 NEWID()。
我使用 SELECT DISTINCT 语句从 Table2 中获取结果,并最终创建了一个视图来为我执行此操作。我会预先声明 Table2View 中没有重复值。
我还尝试将 SELECT 语句的结果放入临时 table 并使用 NEWID()
在临时 table 上填充 GUID 并拉那里的价值观。到目前为止,无论我尝试过什么都会产生相同的错误。
Violation of UNIQUE KEY constraint 'constraintname'. Cannot insert duplicate key in object 'dbo.table1'. The duplicate key value is 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
这是我的查询 运行 填充 table:
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 服务器中的唯一列只允许一个 NULL
值。您似乎有多个 NULL
值,这就是问题所在。
您可以通过用过滤索引替换约束来解决此问题:
create unique index unq_table1_dataid
on (dataid)
where dataid is not null;
我不记得该标准是否实际指定了如何使用唯一约束处理 NULL
值。数据库是双向的。 SQL本身就是不一致的。 . . NULL = NULL
过滤时被视为 false,但聚合时 NULL = NULL
被视为 false。
好巧,我解决了这个问题。我从 GUID 列中删除了主键,之后查询 运行 就好了。似乎它试图在提交完整记录之前提交 NULL 值。在 运行 之后对 table 执行 SELECT * 查询显示没有插入 NULL 值。天啊!