【发布时间】:2017-03-08 11:13:50
【问题描述】:
我正在尝试了解NewId 和'NewSequentialId 在实际生活中的用法,我通常在创建这样的新表时使用Identity 属性:
CREATE TABLE MYTABLE
(
[ID] INT PRIMARY KEY IDENTITY,
[NAME] NVARCHAR(MAX) NOT NULL
);
GO
上面的代码不是最佳实践吗,如果是我应该用这个替换它:
CREATE TABLE MYTABLE
(
[ID] UNIQUEIDENTIFIER PRIMARY KEY DEFAULT NEWID(),
[NAME] VARCHAR(MAX) NOT NULL
);
GO
或者用这个:
CREATE TABLE MYTABLE
(
[ID] UNIQUEIDENTIFIER ROWGUIDCOL PRIMARY KEY DEFAULT NEWSEQUENTIALID(),
[NAME] nVARCHAR(MAX) NOT NULL
);
GO
问题:NewId 或 NEWSEQUENTIALID 是 Identity 的替代品吗?如果不是什么时候使用它们?
我没有尝试将NewId 或NewSequentialId 用作Primary Key,上面的代码仅用于演示目的,也许这个代码更好:
CREATE TABLE MYTABLE
(
[ID] INT NOT NULL PRIMARY KEY,
[ROWGUID] UNIQUEIDENTIFIER ROWGUIDCOL DEFAULT NEWSEQUENTIALID(),
[NAME] nVARCHAR(MAX) NOT NULL
);
GO
【问题讨论】:
-
首先是
INSERT INTO MYTABLE ( NAME ) VALUES ('Ashraf Abusada');,然后是INSERT INTO MYTABLE ( NAME ) VALUES ('Ashraf Abusada');——我们不是只是创建了一个副本吗?是的,停止使用IDENTITY并且出于同样的原因不要使用NEWID()或NEWSEQUENTIALID()。 -
您是否建议改用代码生成序列?
-
我建议一个只有在
IDENTITY列上的键的表没有真正的数据完整性,您应该重新考虑整个方法,而不是调查其他序列号。 -
@onedaywhen ,你用什么例子来证明你的观点是错误的?名称可以重复。制作 varchar 列 PK 效率不高。假设即使像 email 这样的任何 varchar 列在任何表然后我们不做电子邮件PK。我们将身份列作为PK并通过代码检查重复的约束。
标签: sql sql-server database tsql database-design