![]() |
1
418
不能更改标识的现有列。 你有两个选择,
方法1。( 新表 )在这里,您可以在新创建的标识列上保留现有的数据值。
方法2 新专栏 )您可以在新创建的标识列上保留现有的数据值,标识列将保留数字序列。
有关详细信息,请参阅以下Microsoft SQL Server论坛帖子: |
![]() |
2
178
在SQL2005及更高版本中,有一个技巧可以在不更改表的数据页的情况下解决这个问题。对于大表来说,这一点很重要,因为触摸每个数据页可能需要几分钟或几小时。即使标识列是主键,是聚集索引或非聚集索引的一部分,或者其他gotchas(可以触发更简单的“添加/删除/重命名列”解决方案),这种技巧也能起作用。 诀窍如下:您可以使用SQL Server的 ALTER TABLE...SWITCH 语句在不更改数据的情况下更改表的架构,这意味着您可以用相同的表架构(但不包含标识列)替换具有标识的表。同样的技巧也适用于向现有列添加标识。 通常情况下, 更改表…开关 用于有效地将分区表中的完整分区替换为新的空分区。但它也可以用于非分区表中。 我用这个技巧在5秒内将25亿行表中的一列从标识转换为非标识(为了运行一个查询计划对非标识列效果更好的多小时查询),然后在不到5秒钟的时间内恢复标识设置。 这是一个它如何工作的代码示例。
这显然比其他答案中的解决方案更为复杂,但如果您的桌子很大,这可能是一个真正的救生员。有一些警告:
有一个好 article on TechNet 详细说明上述要求。 更新- Eric Wu 在下面添加了有关此解决方案的重要信息的评论。复制到这里以确保它得到更多关注:
如果表正在使用新行进行主动扩展(意味着在添加标识和添加新行之间没有太多的停机时间,则不是
显然,如果没有向表中添加新行(或者只是偶尔添加新行,比如每天的ETL过程),那么不会发生这种争用情况。
|
![]() |
3
61
不能将列更改为标识列。您需要做的是创建一个新列,该列定义为get go中的标识,然后删除旧列,并将新列重命名为旧名称。
马克 |
![]() |
4
13
这里有一个很酷的解决方案: SQL SERVER â Add or Remove Identity Property on Column 简而言之,在SQL管理器中手动编辑您的表,切换标识,不保存更改,只显示将为更改创建的脚本,复制它并在以后使用它。 它节省了大量的时间,因为它(脚本)包含与所更改的表相关的所有外键、索引等。手动写入…上帝禁止。 |
![]() |
5
5
简单的解释 使用sp_rename重命名现有列 exec sp_rename'表名.现有列名','新列名','列' 重命名示例: 现有列userid重命名为olduserid
然后使用alter query添加一个新列,将其设置为主键和标识值
设置主键示例 新创建的列名是userid
然后删除重命名的列
删除重命名列的示例
现在,我们已经向表中现有的列添加了primarykey和标识。 |
![]() |
6
4
我是一个Java开发人员,碰巧在没有DBA的情况下加入团队,而作为开发人员,我不能获得DBA权限。我的任务是在两个数据库之间移动一个完整的模式,因此在没有DBA的情况下,我必须通过运行脚本来完成这项工作,因为我没有管理权限,所以无法在SQL Server 2008中使用GUI。 但是,在新的schema.table上运行存储过程时,所有内容都被毫无问题地移动了,我发现在表中丢失了标识字段。我仔细检查了创建表的脚本,它就在那里,但是,当我运行脚本时,SQL Server没有得到它。后来一位DBA告诉我,他以前也见过这个问题。 在任何情况下,对于SQL Server 2008,这些步骤是我为解决这个问题所采取的,它们都有效的,所以我在这里发布这个消息,希望它能对某些人有所帮助。这就是我所做的,因为我对另一个表有FK依赖性,这使得这更加困难: 我使用这个查询来验证标识是否确实丢失,并查看表上的依赖项。 1.)在表中查找统计信息:
2.)创建一个重复的、相同的新表,除了在以前的pk字段上添加一个标识字段。 3.)禁用标识以移动数据。
4.)传输数据。
5.)验证数据是否存在。
6.)重新启用身份。
7) 这是我找到的最好的脚本,用于获取所有FK关系,以验证原始表作为依赖项引用的表。 我遇到了很多,所以它是一个守门员!
8.)在下一步之前,请确保您拥有所有相关表的pk和fk脚本。 9.)您可以右键单击每个键并使用SQL Server 2008编写脚本。 10.)使用以下语法从依赖表中删除FK:
11.)放下原来的桌子:
13.)这些后续步骤依赖于在步骤9中在SQL Server 2008中创建的脚本。 --将pk添加到新表中。 --将FK添加到新表中。 --将FK添加回依赖关系表。 14.)确认一切都是正确和完整的。我用图形用户界面查看表格。 15.)将新表重命名为原始表名。
最后,一切顺利! |
![]() |
7
4
考虑使用 SEQUENCE instead of IDENTITY . 在SQL Server 2014中(我不知道较低版本),您可以使用sequence简单地执行此操作。
|
![]() |
8
3
根据设计,没有简单的方法可以打开或关闭现有列的标识功能。唯一干净的方法是创建一个新列并使其成为标识列,或者创建一个新表并迁移数据。 如果使用SQL Server Management Studio除去列“id”上的标识值,将创建新的临时表,将数据移动到临时表,删除旧表,并重命名新表。 使用Management Studio进行更改,然后右键单击设计器并选择“生成更改脚本”。 您将看到,这就是SQL Server在后台所做的。 |
![]() |
9
3
您不能这样做,您需要添加另一列、删除原始列并重命名新列或创建新表、复制数据并删除旧表,然后将新表重命名为旧表。 如果使用ssms并在设计器中将identity属性设置为on,那么SQL Server将在后台执行以下操作。因此,如果您有一个名为[user]的表,那么如果您创建userid和identity,就会发生这种情况。
已经说过,有一种方法可以通过设置位值来破解系统表,但这是不受支持的,我不会这样做。 |
![]() |
10
3
正如我在一般情况下所理解的,我们创建的表
主键
正在拥有
标识属性
8。 现在,为标识规则和现有主键约束修改了带有“employeeid”的表“employee” |
![]() |
11
2
遗憾的是,没有一个;Identity属性属于表而不是列。 更简单的方法是在图形用户界面中执行,但是如果这不是一个选项,那么您可以在复制数据、删除列、使用标识重新添加列以及将数据放回这些方面做很多工作。 见 here 为了一个简单的解释。 |
![]() |
12
2
右键单击对象资源管理器中的表名。你会得到一些选择。单击“设计”。将为此表打开一个新选项卡。可以在“列属性”中添加标识约束。 |
![]() |
13
2
要修改列的标识属性:
就这样,而且对我很有效 |
![]() |
14
1
如果原始海报真的想将现有的列设置为
请注意,在
虽然这篇文章很旧,我对请求者的需求做了一个假设,但我认为这些附加信息可能有助于用户遇到这个线程,因为我相信会话可能会导致人们相信,如果不先将现有列添加为新列,就无法将其设置为主键,这是不正确的。 |
![]() |
15
1
根据我目前的情况,我采用这种方法。我想在通过脚本插入数据后为主表提供标识。 因为我想附加标识,所以它总是从1开始到我想要的记录计数结束。
这将创建具有标识的同一主键列 |
![]() |
16
0
我不相信您可以使用TSQL将现有列更改为标识列。但是,您可以通过Enterprise Manager设计视图来完成。 或者,您可以创建一个新行作为标识列,删除旧列,然后重命名新列。
|
![]() |
17
0
基本上有四个逻辑步骤。
可能还有一些更复杂的问题,比如跨多个服务器工作等。 有关步骤(使用ssms&t-sql),请参阅以下文章。这些步骤适用于对T-SQL掌握较少的初学者。 |
![]() |
18
0
为主键=bigint且没有标识集的所有表生成脚本;这将返回每个表生成的脚本列表;
|
|
Johnny T · 基于当前值的SQL合并表[重复] 7 月前 |
![]() |
John D · 需要为NULL或NOT NULL的WHERE子句 7 月前 |
![]() |
ojek · 如何对SQL结果进行分组和编号? 7 月前 |
![]() |
senek · 如何在PL/SQL中将选择结果(列)放入数组中 7 月前 |
![]() |
Sax · 规范化Google表格(第一步) 7 月前 |
![]() |
Jatin · 检索卷计数的动态sql抛出错误语法错误[关闭] 7 月前 |
![]() |
Andrus · 如何在sql中查找第二个匹配项 8 月前 |