【问题标题】:Populating GUID column with NEWID() in an INSERT INTO SELECT FROM statement is throwing an error (NULL) value在 INSERT INTO SELECT FROM 语句中使用 NEWID() 填充 GUID 列会引发错误 (NULL) 值
【发布时间】:2020-06-11 19:56:17
【问题描述】:

如果 Table1 中尚不存在来自 Table2 的值,我将尝试用它们填充 Table1。

Table1 有一个 UNIQUEIDENTIFIER 约束,并指定了 NEWID() 的默认值。

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

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

违反 UNIQUE KEY 约束“constraintname”。无法在对象“dbo.table1”中插入重复键。重复键值为 NULL。

这是 Table1 上的 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

我已经从INSERT 单独运行SELECT 语句,并且没有NULL 值,也没有重复值。查询运行良好,NEWID() 填充了一个 GUID。

但是,将SELECT 语句添加到INSERT INTO 会产生错误。

任何帮助都将不胜感激。我已经用谷歌搜索了这个问题到疯狂的程度。

【问题讨论】:

    标签: sql constraints guid newid


    【解决方案1】:

    SQL Server 中的唯一列只允许一个 NULL 值。您似乎有多个 NULL 值,这就是问题所在。

    您可以通过将约束替换为过滤索引来解决此问题:

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

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

    【讨论】:

    • 感谢您的帮助!
    【解决方案2】:

    巧合的是,我能够解决这个问题。我从 GUID 列中删除了主键,之后查询运行得很好。似乎它试图在提交完整记录之前提交 NULL 值。运行查询后对表执行 SELECT * 表明没有插入 NULL 值。好难过!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-03
      • 2011-12-04
      相关资源
      最近更新 更多