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
不幸的是你不能.
如果您真的想按顺序使用它们,则必须创建一个包含该顺序列的新表并复制数据.或重命名列等.没有简单的方法.
这适用于对更改表没有依赖性的表,这些表会触发级联事件.首先要确保你可以放弃你想重组的桌子,而不会有任何灾难性的后果.记下与表关联的所有依赖项和列约束(即触发器,索引等).完成后,您可能需要将它们重新放入.
步骤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_myTable和myTable_Copy表,如果您选择重命名而不是删除它.