GUID 全为零的 MS SQL table
MS SQL table with GUID All Zeros
我继承了一个 Web 应用程序,其中一个后端 MS SQL table 有一个字段:
Allow Nulls = No, DataType = uniqueidentifier, DefaultValue = newid(), Condensed Data = Type uniqueidentifier
在数千行中,有些行的 GUID 全为零。它似乎不是遗留数据,因为有些数据具有最近的创建日期。
应用程序创建新记录时,SQL 服务器为何未在该字段中放置正确的 GUID?
编辑:此字段的 EF 上下文具有以下内容:
entity.Property(e => e.ThreadId).HasDefaultValueSql("newid()");
如果 SQL 列可以为空,则问题出在您的 C# 代码中。确保 POCO 类 也使用可为空的 Guid。还要确保在创建新实例时初始化 属性。不可为 null 的 Guid 的 C# 默认值是全零 Guid。如果问题仅存在于旧数据,则代码可能已经修复。
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 列不是主键或具有唯一索引,则可以将重复键添加到 table.
如果您向 table 添加检查约束,您可以限制并确定问题的根本原因
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<>fiddle here
我继承了一个 Web 应用程序,其中一个后端 MS SQL table 有一个字段:
Allow Nulls = No, DataType = uniqueidentifier, DefaultValue = newid(), Condensed Data = Type uniqueidentifier
在数千行中,有些行的 GUID 全为零。它似乎不是遗留数据,因为有些数据具有最近的创建日期。
应用程序创建新记录时,SQL 服务器为何未在该字段中放置正确的 GUID?
编辑:此字段的 EF 上下文具有以下内容:
entity.Property(e => e.ThreadId).HasDefaultValueSql("newid()");
如果 SQL 列可以为空,则问题出在您的 C# 代码中。确保 POCO 类 也使用可为空的 Guid。还要确保在创建新实例时初始化 属性。不可为 null 的 Guid 的 C# 默认值是全零 Guid。如果问题仅存在于旧数据,则代码可能已经修复。
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 列不是主键或具有唯一索引,则可以将重复键添加到 table.
如果您向 table 添加检查约束,您可以限制并确定问题的根本原因
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<>fiddle here