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

Posted

技术标签:

【中文标题】SQL Server Management Studio 2012 中的自动递增主键【英文标题】:Auto increment primary key in SQL Server Management Studio 2012 【发布时间】:2012-06-15 01:17:47 【问题描述】:

我如何在SQL Server 数据库表中auto increment primary key,我浏览了论坛但看不到如何操作。

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

一定有一种简单的方法可以做到这一点,但我找不到。

【问题讨论】:

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

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

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

【讨论】:

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

确保 Key 列的数据类型为 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的

【讨论】:

稍微修正一下:IDENTITY 属性可以应用于任何数字数据类型(因此它可以是tinyintsmallintintbigint、@987654330 @, decimal),唯一的限制是它不能代表小数(所以它不能是 floatreal,既不是numeric 也不是decimal 具有非零比例)和ofc,标识规范应与所选数据类型兼容。 工作,只要没有外键等 我只是想补充一点,如果你已经在你的身份列上设置了一个默认值,那么(是身份)仍然是灰色的。删除默认值,它会再次可用。 如果您无法修改这些值,请转到工具-选项-设计器并取消选中“防止保存需要重新创建的更改”选项。【参考方案3】:

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

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

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

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

【讨论】:

啊,这是专门针对 SQL Server 2008 r2 的 - 没关系。 这种创建表的语法是良好的实践,正如this cmets 的作者所建议的那样,希望对某人有所帮助。【参考方案4】:

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

【讨论】:

列属性位于何处?【参考方案5】:

展开您的数据库,展开您的表格,右键单击您的表格并从下拉列表中选择设计

现在转到它下面的Column properties向下滚动并找到Identity Specification,展开它,你会发现Is Identity使它成为Yes。现在选择它正下方的 Identity Increment 给出您想要在其中增加的值。

【讨论】:

这对我来说似乎是正确的答案,只是将数据类型设为 int 并不能解决问题,对吧?【参考方案6】:

也许我遗漏了一些东西,但为什么这不适用于 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 列使用一个简单的计数器,该计数器以用户可定义的值作为种子,然后按用户可定义的值递增。您甚至可以查询和重新设置计数器。我能看到这种情况发生的唯一方法是并发事务“无序”提交。 IE。 首先 碰到 IDENTITY 计数器的事务在 另一个事务之后提交。在这种情况下,您将有一个短暂的空白,然后会被填补。这是避免碰撞所必需的。但 IDENTITY 计数器永远不会跳回。【参考方案7】:

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

【讨论】:

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

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

示例:重启前 ID=11 重启后,你在表中插入新行,那么 id 将为 1012。

【讨论】:

【参考方案9】:

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

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

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

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

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

【讨论】:

【参考方案10】:

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

StudentNumber IDENTITY(1,1) PRIMARY KEY

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

【讨论】:

【参考方案11】:
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”列指定一个值(将自动添加一个唯一值):

【讨论】:

以上是关于SQL Server Management Studio 2012 中的自动递增主键的主要内容,如果未能解决你的问题,请参考以下文章

怎样使用SQL Server Management Studio

标题: Microsoft SQL Server Management Studio

使用 SQL Server Management Studio 连接到 SQL Server

如何在 SQL Server Management Studio 中注册 SQL Server 服务器?

SQL Server Compact Edition 和 SQL Server 2008 Management Studio

从 SQL Server 2016 到 SQL Server Management Studio 2005 的 ETL