带有GUID全零的MS SQL表

时间:2019-02-12 22:57:20

标签: sql-server guid

我继承了一个Web应用程序,其中后端MS SQL表之一的字段包含:

允许Nulls = No,数据类型= uniqueidentifier,默认值= newid(),压缩数据=类型uniqueidentifier

在数千行中,某些GUID的全为零。它似乎不是遗留数据,因为其中一些具有最近的创建日期。

当应用程序创建新记录时,SQL Server如何不在该字段中放置适当的GUID?

编辑:此字段的EF上下文具有以下内容:

entity.Property(e => e.ThreadId).HasDefaultValueSql("newid()");

2 个答案:

答案 0 :(得分:2)

uniqueidentifier数据类型并不意味着它将是唯一的。如果您生成NEWID(),则它会生成唯一的ID,但始终有可能会生成相同的ID。

为0的

insert into t values ('00000000-0000-0000-0000-000000000000');
insert into t values ('00000000-0000-0000-0000-000000000000');
insert into t values (newid());

声明有效。如果您的uid列不是主键或具有唯一索引,则可以将双键添加到表中。


如果将检查约束添加到表中,则可以限制并确定问题的根本原因

create table t (
  id uniqueidentifier unique
  CONSTRAINT CHK_uid CHECK (id != '00000000-0000-0000-0000-000000000000')
);
GO
insert into t values ('00000000-0000-0000-0000-000000000000');
insert into t values ('00000000-0000-0000-0000-000000000000');
insert into t values ('00000000-0000-0000-0000-000000000000');
insert into t values (newid());
GO
Msg 547 Level 16 State 0 Line 1
The INSERT statement conflicted with the CHECK constraint "CHK_uid". The conflict occurred in database "fiddle_80c5a5fe96ab4e73ac5dafbb2256025d", table "dbo.t", column 'id'.
Msg 547 Level 16 State 0 Line 2
The INSERT statement conflicted with the CHECK constraint "CHK_uid". The conflict occurred in database "fiddle_80c5a5fe96ab4e73ac5dafbb2256025d", table "dbo.t", column 'id'.
Msg 547 Level 16 State 0 Line 3
The INSERT statement conflicted with the CHECK constraint "CHK_uid". The conflict occurred in database "fiddle_80c5a5fe96ab4e73ac5dafbb2256025d", table "dbo.t", column 'id'.
Msg 3621 Level 0 State 0 Line 1
The statement has been terminated.
Msg 3621 Level 0 State 0 Line 2
The statement has been terminated.
Msg 3621 Level 0 State 0 Line 3
The statement has been terminated.
select * from t
GO
| id                                   |
| :----------------------------------- |
| ddeb79f6-dc0f-4c6a-a065-2083d39a78c1 |

db <>提琴here

答案 1 :(得分:1)

如果SQL列可为空,则问题出在您的C#代码中。确保POCO类也使用可为空的Guid。另外,请确保在创建新实例时初始化属性。不可为空的Guid的C#默认值为全零Guid。如果仅旧数据存在问题,则该代码可能已经修复。