【发布时间】:2014-12-10 15:40:26
【问题描述】:
我目前正在将表的 Id 字段更改为 IDENTITY 字段。这很简单:创建一个临时表,将所有数据复制到临时表,调整从表到表的所有引用以指向和指向新临时表,删除旧表,重命名临时表原名。
现在我遇到了复制步骤耗时过长的问题。实际上,该表没有太多条目(约 750 万行),但仍需要几个小时才能完成。
我目前正在使用这样的查询移动数据:
设置 IDENTITY_INSERT MyTable_Temp 开启
INSERT INTO MyTable_Temp ([Fields]) 从 MyTable 中选择 [Fields]
SET IDENTITY_INSERT MyTable_Temp 关闭
我查看了 bcp 与 cmdshell 和以下 BULK INSERT 的组合,但我不喜欢该解决方案首先将数据写入临时文件,然后将其转储回新表中。
有没有更有效的方法将数据从旧表复制或移动到新表?这可以在“纯”T-SQL 中完成吗?
请记住,数据是正确的(不涉及外部来源)并且在传输过程中不会对数据进行任何更改。
【问题讨论】:
-
这个问题的第二个答案会帮助你:stackoverflow.com/questions/1049210/…
-
在这种情况下,我看不到如何更改表以将其列更改为标识字段。对我来说,我的表的 Id 字段中的每个条目都是 NOT NULL 和 UNIQUE,但是像“ALTER TABLE MyTable ALTER COLUMN MyTableId INT IDENEITY NOT NULL”这样的内容不适用于错误“关键字'IDENTITY'附近的语法不正确”。 .答案没有指定 alter 语句的外观,我找不到这个问题的答案。我错过了什么吗?
-
来自答案:诀窍是:您可以使用 SQL Server 的 ALTER TABLE...SWITCH 语句来更改表的架构而不更改数据,这意味着您可以将带有 IDENTITY 的表替换为相同的表模式,但没有 IDENTITY 列。同样的技巧可以将 IDENTITY 添加到现有列。
-
在那种情况下,我们正在查看两个不同的答案(我的默认情况下按“活动”排序,而不是按投票排序)。在那种情况下,我会再看看。抱歉,感谢您指出我看不到的内容。这里直接链接到提到的答案:stackoverflow.com/a/1730868/1417088
-
@bruno 该方法是否使该列的外键保持工作?
标签: sql-server tsql