在Server 2008中,我将非空列添加到现有表中,并希望生成默认的NEWSEQUENTIALID()。
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()中命中该值时,它将遇到问题。
发布于 2014-07-28 19:15:44
我尝试了您正在做的事情,但不幸的是,它没有给我顺序I。我最初尝试用NEWSEQUENTIALID()进行更新,但不允许更新。尝试使用默认关键字代替。
UPDATE MyTable SET MyColumn = DEFAULT下面是我为确认GUID是连续的而做的测试:
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列都是数字排序的。
发布于 2014-07-29 06:25:06
1)不需要添加一个空列,更新,然后修改它。可以使用WITH VALUES语法一次完成(请参阅http://sqlfiddle.com/#!3/5e1dea/2):
ALTER TABLE MyTable
ADD MyColumn UNIQUEIDENTIFIER NOT NULL
DEFAULT NEWSEQUENTIALID()
WITH VALUES;2)使用NEWID() vs NEWSEQUENTIALID()是一个没有意义的问题,如果你一次就这么做的话。但为了争论,让我们看看会发生什么。只有在索引列时,才会使用顺序GUID。由于随机GUID是如此随机,插入新值会导致频繁的分页。对于聚集索引列来说,这确实是个问题。但是您没有更新索引列,所以这一点无关紧要。如果稍后添加非聚集索引,则索引生成器将首先对列进行排序,然后生成索引。之后,新插入将在表中找到一个位置,在那里顺序GUID将在随机GUID和从那里开始增长表之间进行排序。这基本上是一个尾页分割(即使不是尾页),所以它仍然是可以的。
总的来说,我认为WITH VALUES语法的使用(令人惊讶的是鲜为人知)使您的问题过时了。我不认为你必须分三步完成改动。
发布于 2014-07-29 04:39:55
只需使用以下内容。
ALTER TABLE MyTable
ADD
MyColumn UNIQUEIDENTIFIER NOT NULL
CONSTRAINT DF_MyTable_MyColumn DEFAULT ( NEWSEQUENTIALID() ) ;https://dba.stackexchange.com/questions/72604
复制相似问题