【发布时间】:2017-08-05 02:23:08
【问题描述】:
我正在尝试向现有的唯一标识符类型 SQL 表添加一列。该列不能为空,当然也是唯一的。我已经尝试过这段代码:
ALTER TABLE ScheduleJobs ADD CurrentInstanceID uniqueidentifier not null
接着是:
ALTER TABLE ScheduleJobs ADD CONSTRAINT DF_CurrentInstanceID DEFAULT newsequentialid() FOR CurrentInstanceID
但是,当我创建一个新记录(来自 C#)时,唯一标识符始终全为零(可能为 null。)我可以在 C# 中创建 GUID,并在创建一个工作正常的新记录时将其传递给 sql,但我我担心可能会创建重复的 GUID。根据我的阅读,这似乎是一种极其罕见的情况,但是让任何类型的潜在错误四处飘荡似乎总是不好的做法。请注意,该字段不会是表的 PK。为了教育,欢迎提出建议和意见。
我正在使用带有 MS SQL SERVER 2008 的 C# 4.0 框架
【问题讨论】:
-
你考虑过使用 GUID 吗?
-
尝试在 sql 端使用 NEWID()
-
您使用哪种技术访问数据库?我知道实体框架默认情况下不会从 db 中设置默认值,因此没有设置默认值。您几乎可以在代码中生成一个新的 guid,它是唯一的,但不是连续的。
-
guid 在表中不是唯一的可能性极低。即使你点击它,如果你已经有约束,SQL Server 也会抛出同样的错误。我认为你过度设计了。我想说不要修复没有损坏的东西。
-
我无法仅在 T-SQL 中重现这一点。在表中插入没有 ID 的行将创建一个新的 GUID。您是否可能向服务器发送零 GUID 而不是 NULL? GUID 是一个结构,这意味着它不能为空。除非您将其定义为 Guid?在您的代码中,传递一个空值将导致一个带有零的 Guid