SQL Server Management Studio 2012中的自动递增主键


446

我如何auto incrementprimary key一个SQL Server数据库表,我已经通过论坛看看,但不能看到。

我看过属性,但是看不到选项,我看到了一个答案,您可以转到Identityspecification属性并将其设置为yes,然后将其设置Identity increment为1,但是该部分显示为灰色,我无法更改不,是的。

必须有一种简单的方法来执行此操作,但我找不到它。


5
关键列的数据类型是int吗?
拉布

1
@CoDe将其当前设置为char(10),但我可以在练习时更改它,谢谢
Ledgemonkey 2012年

Answers:


702

确保“密钥”列的数据类型为int,然后手动设置身份,如图所示

在此处输入图片说明

或者 只是运行此代码

-- 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


21
校正的只是有点:该IDENTITY属性可以被应用于任何数值数据类型(因此它可能是tinyintsmallintintbigintnumericdecimal),唯一的限制是它不能代表分数(所以它不能是 floatreal,既没有numericdecimal 使用非零标度)和ofc,身份规范应与所选数据类型兼容。
2015年

2
工作,只要没有外键等
安德鲁·戴

3
我只是想添加一下,如果您已经在“身份”列上设置了默认值,则“(身份)”将保持为灰色。删除默认值,它将再次可用。
CDspace

7
如果无法修改值,请转到“工具”-“选项”-“设计器”,然后取消选中“防止保存需要重新创建的更改”选项。
Jaume

184

创建表时,可以IDENTITY如下创建列:

CREATE TABLE (
  ID_column INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
  ...
);

IDENTITY属性将使列从1开始自动递增。(请注意,列的数据类型必须为整数。)如果要将其添加到现有列,请使用ALTER TABLE命令。

编辑:经过
测试,我找不到通过各种表的Column Properties窗口更改Identity属性的方法。我想如果您想将一列设置为标识列,则必须使用ALTER TABLE命令。


嗯,这是专门针对SQL Server 2008 r2的-没关系。
Josien 2012年

2
这个创建表的语法是很好的做法是通过建议的作者 这个帖子的评论中,希望可以帮助别人。
shaijut 2015年

88

您必须展开“身份”部分以显示增量和种子。

在此处输入图片说明

编辑:我假设您将有一个整数数据类型,而不是char(10)。发布此答案时,我会说合理且有效


2
yes是灰色的,因为它是char(10)(从评论刚刚发布)
马丁·史密斯

@Martin Smith是的,这似乎是普遍的问题,我将更改这一点并进行测试,非常感谢
Ledgemonkey 2012年

在创建新表时,我BookID int primary key identity没有同时指定种子和增量,这是一种好习惯吗?原因是我在MSDN中看到文档,如果未指定,则默认为(1,1)。
shaijut

40

展开数据库,展开表,右键单击表,然后从下拉列表中选择设计它看起来像这样

现在转到其下方的“ 列属性 ”,向下滚动并找到“ 身份规范”,将其展开,您将发现“身份是否使它为是”。现在,在它下面的“ 身份增量 ”中选择要增加的值。 在此处输入图片说明


1
这似乎是对我的正确答案,只是将数据类型设置为int不会解决问题,对吗?
德鲁丁2013年

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

当说squence时,请使用INSERT命令:

NEXT VALUE FOR blah.blahsequence

SEQUENCE的更多信息和选项


如果您关心插入行的时间顺序,那么此解决方案是正确的,因为IDENTITY有时会跳跃而留下空白,然后又会重新填补这些空白。因此IDENTITY,不能保证总是incrmenet状态
FindOut_Quran

1
@Martin Smith Oops,没有点击链接,我的错!我已经习惯了MS-SQL的某些功能,以至于我有时会忘记有支持更多功能的较新版本。我将删除我的评论,因为这可能会引起混淆...如果表达得更笼统,它仍然有效:可能是因为他使用的是不支持SEQUENCE对象的RDBMS版本/版本-尤其是因为仅询问了一个问题SQL Server 2012发布几个月后;)
Paul Groke

1
@FindOut_Quran您确定IDENTITY列中的空白被填满了吗?我只使用过SQL Server 2005,但从未见过这种情况-差距仍然存在。而且我很惊讶在任何RDBMS上都能看到它,因为这样的功能将是“非免费”(性能方面)和“不理想”(至少在大多数应用程序中)的奇怪组合。
Paul Groke

@PaulGroke是的,我确定。您可以尝试使用事务插入1000行,然后回滚。意识度值将上升。尝试插入更多的行并提交/或回滚。您会发现有时它会填补空白
FindOut_Quran

@FindOut_Quran我看不到这是怎么发生的。MS SQL IDENTITY列使用一个简单的计数器,该计数器以用户可定义的值作为种子,然后递增一个用户可定义的值。您甚至可以查询并重新设置计数器。我看到这种情况的唯一方法是并发事务“无序”提交时。也就是说,最初碰撞IDENTITY计数器的交易另一笔交易之后提交。在这种情况下,您将有一个短暂的空白,然后被填补。避免碰撞是必需的。但是,IDENTITY计数器永远不会跳回来。
Paul Groke

7

使用数据类型:int时,您可以选择要自动递增的行,然后转到列属性标签。在那里,您可以将身份设置为“是”。自动增量的起始值也可以在此处进行编辑。希望我能帮忙;)


列属性位于哪里?

2

我遇到的问题是我已经创建了表,并且无法不删除就无法更改它,所以我要做的是:(不知道他们何时实现此功能,但在SQL 2016中拥有它)

右键单击对象资源管理器中的表:

Script Table as > DROP And CREATE To > New Query Editor Window

然后对Josien所说的脚本进行编辑;滚动到底部CREATE TABLE,找到您的主键,并IDENTITY(1,1)在逗号前附加到末尾。运行脚本。

由于这个问题,DROP和CREATE脚本对我也很有帮助(哪个生成的脚本处理。)


1

小心,例如是否要让ID元素为contigius。由于SQLSERVER ID可以跳转1000。

例子:重启前ID = 11重启后,在表中插入新行,则ID为1012。


1

创建表时,可以将关键字IDENTITYPRIMARY KEY约束一起用作列的数据类型。
例如:

StudentNumber IDENTITY(1,1) PRIMARY KEY

在这里,第一个“ 1”表示初始值,第二个“ 1”表示增量值。


1
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)。

要将新记录插入“人”表中,我们将不必为“人名”列指定值(将自动添加一个唯一值):


0

如果表已被填充,则无法将列更改为IDENTITY列或将其转换为非IDENTITY列。您将需要导出所有数据,然后可以将列类型更改为IDENTITY,反之亦然,然后将数据导入回来。我知道这是一个痛苦的过程,但是我相信除了使用这篇文章中提到的序列,别无选择。


1
您可以使用它ALTER TABLE ... SWITCH来切换元数据,而完全不必触摸数据。例如,查看在创建表后如何设置自动增量而不会丢失任何数据?
马丁·史密斯

1
您提供的链接中提到的过程涉及将数据传输到temp表并返回,这与我上面的声明一致。如果我错了,请给我一个工作的例子。
Softec

1
链接中有一个有效的示例。没有“将数据传输到临时表并返回”。`ALTER TABLE ... SWITCH`是仅元数据更改。它不会移动任何数据。
马丁·史密斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.