SQL Server Management Studio 2012中的自增主键

577

我该如何在SQL Server数据库表中实现自动递增主键?我在论坛上查看过,但没有找到如何做到这一点。

我查看了属性,但没有看到选项。我看到一个答案是要前往Identity规范属性,并将其设置为yes,并将Identity increment设置为1,但该部分被禁用,我无法将no更改为yes

肯定有一种简单的方法来实现这一点,但我找不到它。


6
关键列的数据类型是整数(int)吗? - Raab
1
@CoDe aDDict,它目前设置为char(10),但我可以更改它,因为我只是在练习,谢谢。 - Ledgemonkey
12个回答

873
确保Key列的数据类型为int,并手动设置标识,如图所示。

enter image description here

或者只需运行此代码,使用IDENTITY(seed, increment)修饰符。
-- ID is the name of the  [to be] identity column
ALTER TABLE [yourTable] DROP COLUMN ID 
ALTER TABLE [yourTable] ADD ID INT IDENTITY(1,1)

代码将运行,如果ID不是表中唯一的列。
图像参考FIFO的。

29
稍作修正: IDENTITY 属性可以应用于任何数值数据类型(比如 tinyint, smallint, int, bigint, numeric, decimal),唯一的限制是它不能表示小数(因此不能是 floatreal,以及 numericdecimal 带有非零精度),当然,标识规格应与所选数据类型兼容。 - Pred
4
只要没有外键等约束条件,工作正常。 - Andrew Day
4
如果您已经在标识列上设置了默认值,那么(Is Identity)选项将保持灰色。请移除默认值,该选项即可重新启用。 - CDspace
13
如果您无法修改值,请转到“工具-选项-设计师”并取消选中“防止保存需要重新创建的更改”的选项。 - Jaume
1
为什么它被称为“identity”?这似乎是一种非常抽象的描述自增值的方式。 - carloswm85

254
在创建表格时,可以按如下方式创建一个IDENTITY列:
CREATE TABLE (
  ID_column INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
  ...
);
IDENTITY 属性将自动递增列的值,从1开始。(请注意,列的数据类型必须为整数。)如果您想将此属性添加到现有列中,请使用 ALTER TABLE 命令。
编辑:
经过一些测试,我发现无法通过各种表的“列属性”窗口更改 Identity 属性。我猜想,如果您想将某列设置为 Identity 列,您必须使用 ALTER TABLE 命令。

啊,这只适用于 SQL Server 2008 r2 - 没关系。 - Josien
3
这个创建表的语法是“良好实践”,正如此帖中作者在评论中建议的那样,希望能对某些人有所帮助。 - Shaiju T

102

您需要扩展“身份”部分以公开增量和种子。

输入图像说明

编辑:我假设您有一个整数数据类型,而不是char(10)。 我认为这是合理的,并且在我回答时是有效的。


3
“yes”被变成灰色是因为它是一个“char(10)”(来自刚刚发布的评论)。 - Martin Smith
@Martin Smith 是的,那似乎是普遍问题,我将更改并测试,非常感谢。 - Ledgemonkey
在创建新表时,我使用了“BookID int primary key identity”语句,但没有指定种子和增量值,这样做是否合理?因为我在MSDN文档中看到,如果未指定这两个参数,则默认值是(1,1)。 - Shaiju T

47

拓展你的数据库,扩展你的表格,右键点击表格并从下拉菜单中选择设计ITlooks like this

现在进入列属性,在下面滚动并找到标识规范,展开它,你将找到是否为标识,将其设置为“是”。现在选择标识增量,在它的下面给出你想要递增的值。 enter image description here


2
这对我来说似乎是正确的答案,仅将数据类型更改为int并不能解决问题,对吧? - Drewdin

18
CREATE TABLE Persons (
    Personid int IDENTITY(1,1) PRIMARY KEY,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Age int
);

MS SQL Server 使用IDENTITY关键字执行自动递增功能。

在上面的示例中,IDENTITY的起始值为1,并且每个新记录都将递增1。

提示:要指定“Personid”列应从值10开始并递增5,请将其更改为IDENTITY(10,5)。

要向“Persons”表中插入新记录,我们不需要为“Personid”列指定值(唯一值将自动添加):


10

也许我还有所遗漏,但是为什么这个方法不能用在SEQUENCE对象上呢?这不是你要找的吗?

例如:

CREATE SCHEMA blah.
GO

CREATE SEQUENCE blah.blahsequence
START WITH 1
INCREMENT BY 1
NO CYCLE;

CREATE TABLE blah.de_blah_blah
(numbers bigint PRIMARY KEY NOT NULL
......etc

在插入命令中引用该序列时,只需使用:

NEXT VALUE FOR blah.blahsequence

了解更多信息和选项,请参阅SEQUENCE


如果您关心插入行的时间顺序,那么这个解决方案是正确的,因为IDENTITY有时会跳过并留下间隙,然后再回来填补这些间隙。因此,IDENTITY不能保证始终满足增量条件。 - FindOut_Quran
1
@Martin Smith 抱歉,我没有跟进链接,是我的错误!我已经习惯了 MS-SQL 没有某些功能,有时会忘记有更新的版本支持更多的东西。我会删除我的评论,因为它可能会让人感到困惑...如果表达得更普遍,它仍然是有效的:可能他正在使用一个不支持 SEQUENCE 对象的 RDBMS 版本 - 尤其是在 SQL Server 2012 发布后仅几个月内提出这个问题 ;) - Paul Groke
1
@FindOut_Quran 你确定IDENTITY列中的间隙会被填补吗?我只使用过SQL Server 2005,从未见过这种情况发生 - 这些间隙只是保留下来。如果在任何RDBMS上看到它发生,我会感到非常惊讶,因为这样的功能将是“不自由”(从性能角度)和“不理想”的奇怪组合(至少在大多数应用程序中)。 - Paul Groke
@PaulGroke 请参考 https://dev59.com/QmUq5IYBdhLWcg3wQ-Xk#14642085 和 https://dev59.com/K2Yq5IYBdhLWcg3w2EJi。 - FindOut_Quran
@FindOut_Quran 好的,这很好地解释了如何创建大间隔。但我在其中找不到任何东西来解释它们是如何被填补的,甚至没有暗示。除了我已经描述过的情况,即多个正在进行的事务提交“无序”。 - Paul Groke
显示剩余2条评论

7

当你使用数据类型:int时,你可以选择想要自动增加的行并进入列属性标签。在那里,你可以将identity设置为“是”。自动增量的起始值也可以在那里编辑。希望我能帮到你;)


列属性位于哪里? - user3376708

4
我遇到了这样的问题,已经创建了表,但无法更改它而不删除表,所以我做了以下操作:(不确定他们何时实现了这个,但在SQL 2016中有它)
在对象资源管理器中右键单击表:
脚本表作为> DROP And CREATE To>新查询编辑器窗口
然后按照Josien所说的编辑脚本;滚动到底部,找到您的主键并在逗号之前添加IDENTITY(1,1)。运行脚本。
DROP和CREATE脚本对我也很有帮助,因为this issue.(生成的脚本处理此问题。)

2

在创建表时,您可以将关键字IDENTITY作为数据类型与PRIMARY KEY约束一起用于列。
例如:

StudentNumber IDENTITY(1,1) PRIMARY KEY

这里的第一个'1'表示起始值,第二个'1'是增加值。


1
如果表已经被填充,就无法将列更改为IDENTITY列或将其转换为非IDENTITY列。您需要先导出所有数据,然后可以将列类型更改为IDENTITY或相反,然后再将数据导入回去。 我知道这是一个痛苦的过程,但我相信除了在此帖子中提到的使用序列之外别无选择。

1
您可以使用 ALTER TABLE ... SWITCH 来仅切换元数据,而无需触及任何数据。例如,请参见 如何在创建不带任何数据丢失的表后设置自动递增? - Martin Smith
1
链接中提到的过程涉及将数据传输到临时表中,然后再返回,这与我上面的陈述一致。如果我错了,请提供一个可行的示例。 - Softec
1
链接中有一个可运行的示例。没有“将数据传输到临时表然后再返回”的操作。ALTER TABLE ... SWITCH仅是元数据更改,不移动任何数据。 - Martin Smith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接