在insert into select from语句中用newid()填充guid列会引发错误(null)值

a7qyws3x  于 2021-07-29  发布在  Java
关注(0)|答案(2)|浏览(495)

我试图用表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 产生错误。
任何帮助都将不胜感激。我在谷歌上搜索了这个问题,简直疯了。

e4eetjau

e4eetjau1#

sql server中的唯一列只允许一个 NULL 价值观。你好像有多个 NULL 价值观,这就是问题所在。
可以通过将约束替换为筛选索引来解决此问题:

create unique index unq_table1_dataid
    on (dataid)
    where dataid is not null;

我不记得标准是否真的规定了 NULL 值使用唯一约束进行处理。数据库是双向的。sql本身不一致。 NULL = NULL 过滤时被视为false,但是 NULL = NULL 进行聚合时。

w51jfk4q

w51jfk4q2#

巧合的是,我能解决这个问题。我从guid列中删除了主键,然后查询就可以正常运行了。它似乎是在提交完整记录之前尝试提交空值。在运行查询之后,对表执行select*操作将显示没有插入空值。好悲伤!

相关问题