我有这张桌子:
CREATE TABLE [dbo].[Phrase]
(
[PhraseId] [uniqueidentifier] NOT NULL,
[PhraseNum] [int] NULL
[English] [nvarchar](250) NOT NULL,
PRIMARY KEY CLUSTERED ([PhraseId] ASC)
) ON [PRIMARY]
GO
我想要做的是对表进行排序,并使用一个数字填充列PhraseNum
,其中排序表的第一行为1
,之后的每一行都有一个更大的值比之前的那个。
答案 0 :(得分:1)
在SQL Server中,您可以使用标识列执行此操作:
CREATE TABLE [dbo].[Phrase](
[PhraseId] [uniqueidentifier] NOT NULL PRIMARY KEY,
[PhraseNum] int identity(1, 1) NOT NULL
[English] [nvarchar](250) NOT NULL
);
将唯一标识作为(群集)主键是一个非常非常糟糕的主意。为什么?未订购新值。这意味着必须为每个insert
重新排序数据 - 导致碎片化。
您应该使用PhraseNum
列作为主键。
答案 1 :(得分:1)
Alan,如果PhraseNum中的数据不重要(正如我在帖子中看到的那样),您可以删除该列并添加为标识列
ALTER TABLE Phrase drop column PhraseNum ;
ALTER TABLE Phrase Add PhraseNum int identity(1,1) not null;
PhraseNum的编号将通过群集索引排序标准完成,因此通过PhraseId
但首先在测试数据库上进行测试是安全的