如何在特定列之后在TSQL中添加列?

Jus*_*808 37 t-sql alter-table

我有一张桌子:

MyTable
    ID
    FieldA
    FieldB
Run Code Online (Sandbox Code Playgroud)

我想改变表并添加一列,如下所示:

MyTable
    ID
    NewField
    FieldA
    FieldB
Run Code Online (Sandbox Code Playgroud)

在MySQL中我会这样:

ALTER TABLE MyTable ADD COLUMN NewField int NULL AFTER ID;
Run Code Online (Sandbox Code Playgroud)

一条线,漂亮,简单,效果很好.我如何在微软的世界里做到这一点?

Mik*_* M. 33

不幸的是你不能.

如果您真的想按顺序使用它们,则必须创建一个包含该顺序列的新表并复制数据.或重命名列等.没有简单的方法.

  • 您只需在Management Studio中拖动该列即可.这很容易 (5认同)
  • Management Studio可以为您销毁和重新创建表,但是如果您有一个非常非常庞大的表,其中包含很多行,那么最好只更改它.如果有办法在不破坏桌子的情况下做到这一点会很好.管理工作室实际上可以选择阻止您这样做,因为它可能非常耗时. (5认同)
  • 如果需要对表进行破坏性更改,@PreguntonCojoneroCabrónManagement Studio可以将数据复制到一个临时位置来维护数据。像这样的操作就是在表中按特定顺序放置一列,其中需要删除并重新创建表。SSMS复制数据,删除表,使用新架构重新创建表,然后将数据添加回表。 (2认同)

Mil*_*lan 7

解:

这适用于对更改表没有依赖性的表,这些表会触发级联事件.首先要确保你可以放弃你想重组的桌子,而不会有任何灾难性的后果.记下与表关联的所有依赖项和列约束(即触发器,索引等).完成后,您可能需要将它们重新放入.

步骤1:创建临时表以保存要重组的表中的所有记录.不要忘记包含新列.

CREATE TABLE #tmp_myTable
(   [new_column] [int] NOT NULL, <-- new column has been inserted here!
    [idx] [bigint] NOT NULL,
    [name] [nvarchar](30) NOT NULL,
    [active] [bit] NOT NULL
)
Run Code Online (Sandbox Code Playgroud)

第2步:确保已复制所有记录,并确保列结构符合您的要求.

SELECT TOP 10 * FROM #tmp_myTable ORDER BY 1 DESC - 您可以执行COUNT(*)或任何操作以确保复制所有记录

第3:删除原始表:

DROP TABLE myTable

如果你对可能发生的坏事感到偏执,只需重命名原始表(而不是丢弃它).这样它总是可以返回.

EXEC sp_rename myTable, myTable_Copy
Run Code Online (Sandbox Code Playgroud)

步骤4:以您希望的方式重新创建表myTable(应匹配#tmp_myTable表结构)

CREATE TABLE myTable
(   [new_column] [int] NOT NULL,
    [idx] [bigint] NOT NULL,
    [name] [nvarchar](30) NOT NULL,
    [active] [bit] NOT NULL
)
Run Code Online (Sandbox Code Playgroud)

- 不要忘记您可能需要的任何限制

步骤5:将temp #tmp_myTable表中的所有记录复制到新的(改进的)表myTable中.

INSERT INTO myTable ([new_column],[idx],[name],[active])
SELECT [new_column],[idx],[name],[active]
FROM #tmp_myTable
Run Code Online (Sandbox Code Playgroud)

第6 :检查所有数据是否都返回到新的改进表myTable中.如果是,请自行清理并删除临时表#tmp_myTablemyTable_Copy表,如果您选择重命名而不是删除它.