ChatGPT解决这个技术问题 Extra ChatGPT

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

如何在 SQL Server 数据库表中auto increment primary key?我已经浏览了论坛,但看不到如何做到这一点。

我查看了属性,但看不到选项。我看到了一个答案,您转到 Identity 规范属性并将其设置为 yes 并将 Identity increment 设置为 1,但该部分显示为灰色,我无法更改

必须有一个简单的方法来做到这一点,但我找不到它。

键列的数据类型是 int 吗?
@CoDe aDDict 其当前设置为 char(10) 但我可以在练习时更改它,谢谢

R
Raab

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

https://i.stack.imgur.com/ueRYJ.jpg

或者只是运行这段代码

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


稍微更正一下:IDENTITY 属性可以应用于任何数字数据类型(因此它可以是 tinyintsmallintintbigintnumericdecimal),唯一的限制是它不能表示小数(所以它不能是 floatreal,既不是 numeric 也不是 decimal 具有非零刻度) 和 ofc,标识规范应与所选数据类型兼容。
工作,只要没有外键等
我只是想补充一点,如果您已经在身份列上设置了默认值,则 (Is Identity) 仍然是灰色的。删除默认值,它会再次可用。
如果您无法修改这些值,请转到工具-选项-设计器并取消选中“防止保存需要重新创建的更改”选项。
为什么还要命名为“身份”?这是一种描述自增值的非常抽象的方式。
S
Shaiju T

在创建表时,您可以创建一个 IDENTITY 列,如下所示:

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

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

编辑:
测试了一下,我找不到通过“列属性”窗口更改各种表的身份属性的方法。我想如果你想让一个列成为标识列,你必须使用 ALTER TABLE 命令。


啊,这是专门针对 SQL Server 2008 r2 的 - 没关系。
正如 this 的作者在评论中所建议的那样,这种创建表语法是 良好做法,希望对某人有所帮助。
g
gbn

您必须展开 Identity 部分以公开增量和种子。

https://i.stack.imgur.com/8QAfh.png

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


yes 是灰色的,因为它是 char(10)(来自刚刚发布的评论)
@Martin Smith 是的,这似乎是普遍问题,我要更改并测试,非常感谢
在创建我使用 BookID int primary key identity 的新表时,我没有指定种子和增量,这是好的做法吗?因为我在 MSDN 中看到了文档如果两者都没有指定,则默认为 (1,1) 。
A
Andrew Barber

https://i.stack.imgur.com/SBQvM.jpg

https://i.stack.imgur.com/ueRYJ.jpg


这似乎对我来说是正确的答案,只是将数据类型设置为 int 并不能解决问题,对吧?
A
Abd Abughazaleh
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”列指定值(将自动添加唯一值):


T
Techie Joe

也许我遗漏了一些东西,但为什么这不适用于 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

在说 INSERT 命令中引用序列时,只需使用:

NEXT VALUE FOR blah.blahsequence

SEQUENCE 的更多信息和选项


如果您关心插入行的时间顺序,则此解决方案是正确的,因为 IDENTITY 有时会跳转而留下空白,然后它会再次返回以填补这些空白。所以 IDENTITY 不保证总是增加条件
@Martin Smith 哎呀,没有点击链接,我的错!我已经习惯了 MS-SQL 没有某些功能,以至于我有时会忘记有支持更多东西的更新版本。我将删除我的评论,因为它可能会令人困惑......如果表达得更笼统,它仍然有效:可能是他使用的 RDBMS 制作/版本不支持 SEQUENCE 对象 - 特别是因为这个问题只被问到一个SQL Server 2012 发布几个月后;)
@FindOut_Quran 您确定 IDENTITY 列中的空白已填满吗?我只使用过 SQL Server 2005,我从未见过这种情况发生 - 差距仍然存在。看到它发生在任何 RDBMS 上,我会感到相当惊讶,因为这样的功能将是“不免费”(性能方面)和“不可取”(至少在大多数应用程序中)的奇怪组合。
@PaulGroke 是的,我确定。您可以尝试使用事务来插入 1000 行,然后回滚。同一性值会上升。尝试插入更多的数千行并提交/或回滚。你会注意到它有时会填补空白
@FindOut_Quran 我看不出这是怎么发生的。 MS SQL IDENTITY 列使用一个简单的计数器,该计数器以用户可定义的值作为种子,然后按用户可定义的值递增。您甚至可以查询和重新设置计数器。我能看到这种情况发生的唯一方法是并发事务“无序”提交。即,第一次碰到 IDENTITY 计数器的事务在另一个事务之后提交。在这种情况下,您将有一个短暂的空白,然后会被填补。这是避免碰撞所必需的。 IDENTITY 计数器永远不会跳回。
W
WhatEvil

当您使用 Data Type: int 时,您可以选择要自动递增的行并转到列属性标签。在那里,您可以将身份设置为“是”。也可以在那里编辑自动增量的起始值。希望我能帮上忙;)


列属性位于何处?
c
cheriejw

我遇到了这个问题,我已经创建了表,并且在不删除表的情况下无法更改它,所以我所做的是:(不确定他们何时实现此功能,但在 SQL 2016 中已实现)

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

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

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

DROP 和 CREATE 脚本对我也很有帮助,因为 this issue.(生成的脚本会处理它。)


C
Chanuka Naveen Koswatta

您可以在创建表时使用关键字 IDENTITY 作为列的数据类型以及 PRIMARY KEY 约束。
例如:

StudentNumber IDENTITY(1,1) PRIMARY KEY

在这里,第一个“1”表示起始值,第二个“1”是递增值。


S
Softec

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


您可以使用 ALTER TABLE ... SWITCH 来切换元数据,而无需接触数据。例如参见how to set auto increment after creating a table without any data loss?
您提供的链接中提到的过程涉及将数据传输到临时表并返回,这与我上面的陈述一致。如果我错了,请给我一个工作示例。
链接中有一个工作示例。没有“将数据传输到临时表并返回”。 ` ALTER TABLE ... SWITCH` 是元数据唯一更改。它不移动任何数据。
J
Java Main

如果您希望 ID 元素是连续的,请小心。因为 SQLSERVER ID 可以跳跃 1000 。

示例:在重新启动之前 ID=11 重新启动后,您在表中插入新行,则 ID 将为 1012。