在INSERT INTO SELECT FROM语句中用NEWID()填充GUID列时,出现错误(NULL)值。

问题描述 投票:0回答:1

我试图用Table2中的值填充Table1,如果它们还不存在于Table1中。

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

我是用SELECT DISTINCT语句从Table2中获取结果的,最后只是为我创建了一个视图。我先声明 没有重复值 在Table2View中。

我也尝试过将SELECT语句的结果下放到一个临时表,并在临时表上使用以下方法填充GUID NEWID() 并从那里把值拉过来。无论我尝试了什么,到目前为止都会产生同样的错误。

违反UNIQUE KEY约束'constraintname'。无法在对象'dbo.table1'中插入重复键。重复键值为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

这是我运行的查询来填充表的内容

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 产生错误。

任何帮助都将是非常感激的。我已经谷歌这个问题到了疯狂的地步。

sql constraints guid newid
1个回答
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 做聚合的时候。


0
投票

好巧不巧,我能够解决这个问题。我从GUID列中删除了主键,之后查询运行得很好。看来是想先提交NULL值再提交完整记录。运行查询后对表进行SELECT *,显示没有插入NULL值。天哪!

© www.soinside.com 2019 - 2024. All rights reserved.