我继承了一个Web应用程序,其中后端MS SQL表之一的字段包含:
允许Nulls = No,数据类型= uniqueidentifier,默认值= newid(),压缩数据=类型uniqueidentifier
在数千行中,某些GUID的全为零。它似乎不是遗留数据,因为其中一些具有最近的创建日期。
当应用程序创建新记录时,SQL Server如何不在该字段中放置适当的GUID?
编辑:此字段的EF上下文具有以下内容:
entity.Property(e => e.ThreadId).HasDefaultValueSql("newid()");
答案 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。如果仅旧数据存在问题,则该代码可能已经修复。