首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向现有表中添加不可空的NEWSEQUENTIALID()列

向现有表中添加不可空的NEWSEQUENTIALID()列
EN

Database Administration用户
提问于 2014-07-28 18:50:35
回答 3查看 7.9K关注 0票数 3

在Server 2008中,我将非空列添加到现有表中,并希望生成默认的NEWSEQUENTIALID()。

代码语言:javascript
复制
ALTER TABLE MyTable 
ADD MyColumn UNIQUEIDENTIFIER NULL
CONSTRAINT DF_MyTable_MyColumn DEFAULT NEWSEQUENTIALID()

UPDATE MyTable SET MyColumn = NEWID()

ALTER TABLE MyTable
ALTER COLUMN MyColumn UNIQUEIDENTIFIER NOT NULL

如上面所示,用NEWID()填充列是安全的,还是有更好的方法来使用顺序ID值?

我担心NEWID()将生成一个新的guid,该guid可能接近顺序guid。然后,当序列guid从NEWID()中命中该值时,它将遇到问题。

EN

回答 3

Database Administration用户

回答已采纳

发布于 2014-07-28 19:15:44

我尝试了您正在做的事情,但不幸的是,它没有给我顺序I。我最初尝试用NEWSEQUENTIALID()进行更新,但不允许更新。尝试使用默认关键字代替。

代码语言:javascript
复制
UPDATE MyTable SET MyColumn = DEFAULT

下面是我为确认GUID是连续的而做的测试:

代码语言:javascript
复制
CREATE TABLE MyTable (id int not null identity(1,1))
GO

INSERT INTO MyTable DEFAULT VALUES
GO 1000

ALTER TABLE MyTable 
ADD MyColumn UNIQUEIDENTIFIER NULL
CONSTRAINT DF_MyTable_MyColumn DEFAULT NEWSEQUENTIALID()
GO
UPDATE MyTable SET MyColumn = DEFAULT
GO
ALTER TABLE MyTable
ALTER COLUMN MyColumn UNIQUEIDENTIFIER NOT NULL
GO

SELECT * FROM MyTable ORDER BY MyColumn 

我对结果进行了快速扫描,我的id列都是数字排序的。

票数 3
EN

Database Administration用户

发布于 2014-07-29 06:25:06

1)不需要添加一个空列,更新,然后修改它。可以使用WITH VALUES语法一次完成(请参阅http://sqlfiddle.com/#!3/5e1dea/2):

代码语言:javascript
复制
ALTER TABLE MyTable 
ADD MyColumn UNIQUEIDENTIFIER NOT NULL
  DEFAULT NEWSEQUENTIALID()
WITH VALUES;

2)使用NEWID() vs NEWSEQUENTIALID()是一个没有意义的问题,如果你一次就这么做的话。但为了争论,让我们看看会发生什么。只有在索引列时,才会使用顺序GUID。由于随机GUID是如此随机,插入新值会导致频繁的分页。对于聚集索引列来说,这确实是个问题。但是您没有更新索引列,所以这一点无关紧要。如果稍后添加非聚集索引,则索引生成器将首先对列进行排序,然后生成索引。之后,新插入将在表中找到一个位置,在那里顺序GUID将在随机GUID和从那里开始增长表之间进行排序。这基本上是一个尾页分割(即使不是尾页),所以它仍然是可以的。

总的来说,我认为WITH VALUES语法的使用(令人惊讶的是鲜为人知)使您的问题过时了。我不认为你必须分三步完成改动。

票数 4
EN

Database Administration用户

发布于 2014-07-29 04:39:55

只需使用以下内容。

代码语言:javascript
复制
ALTER TABLE MyTable 
ADD 
    MyColumn UNIQUEIDENTIFIER NOT NULL
        CONSTRAINT DF_MyTable_MyColumn DEFAULT ( NEWSEQUENTIALID() ) ;
票数 3
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/72604

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档