如果为null,如何在sql中生成uniqueidentifier

本文关键字:sql uniqueidentifier null 如果 | 更新日期: 2023-09-27 18:21:06

我正在尝试向uniqueidentifier类型的现有SQL表添加一列。该列不能为null,当然也不能是唯一的。我尝试过这个代码:

ALTER TABLE ScheduleJobs ADD CurrentInstanceID uniqueidentifier not null

然后是:

ALTER TABLE ScheduleJobs ADD CONSTRAINT DF_CurrentInstanceID DEFAULT newsequentialid() FOR CurrentInstanceID

然而,当我(从C#)创建一个新记录时,uniqueidentifier总是全零(可能为null)。我可以在C#中创建GUID,并在创建新记录时将其传递给sql,这很好,但我担心可能会创建重复的GUID。根据我的阅读,这似乎是一种极为罕见的情况,但任何潜在的错误都是不好的做法。请注意,该字段将不是表的PK。欢迎为教育目的提出建议和意见。

我使用的是带有MS SQL SERVER 2008 的C#4.0框架

如果为null,如何在sql中生成uniqueidentifier

很抱歉延迟,但我很高兴地说,我已经解决了这个问题。感谢大家的大力支持。虽然没有人一针见血(顺便说一句,有一些非常好的建议),但Eldog在评论中提到了实体框架不太好。多亏了他,我简单地在谷歌上搜索了实体框架+GUID,找到了解决方案。

这篇文章逐步解决了这个问题,并对问题、解决方案和解决步骤进行了很好的解释。我会注意到,我决定一步一步地进行测试,而不必执行最后一步。这让我相信,在实体框架的后续版本中,部分问题可能已经得到解决。

我只是在设计视图(而不是xml)中调出edmx文件,并将StoreGeneratedPattern属性设置为"Identity"

再次感谢您的帮助和建议。你们是一群了不起的人。

您的C#代码在创建记录时是否尝试传入CurrentInstanceID?如果是的话,您能从INSERT语句中删除该列吗?

我们使用数字主键来完成此操作。我们的C#代码调用一个存储过程来对我们的记录进行CRUD操作。C#代码在客户端生成一个负密钥供自己使用。当它准备好创建记录时,它会将此密钥传递给存储过程。

proc会忽略这个键并插入其余的数据。proc的输出是SQL分配给记录的实际键。最后,C#代码将新密钥合并到现有数据中。

我不会为此使用GUID。GUID在windows中的许多操作中都使用,因此它不会是一个仅在应用程序中唯一的标识符,而是在操作系统中唯一的。除非这对你的情况有意义,否则我不会使用它

您可以使用一个增量值,比如一个简单的uint。如果您的表已经有一些数据,您可以编写一个脚本,用新列的增量值填充现有行,并在执行该脚本后将唯一约束添加到列中。

在原始的Create表或alter表中使用以下

create table ScheduleJobs (keyval int, id2 uniqueidentifier not null default newsequentialid())

然后不要引用插入中的列,将添加一个新的GUID值