如果表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 值。好悲伤!