为什么我不能重新排序我的SQL Server列?

时间:2010-12-09 19:35:29

标签: sql sql-server

我有一张带有FK的旧桌子。我想添加一个新列。我想把这个新列作为主键。所以我认为我可以插入该列作为第一个列,或者将其插入到表的末尾,然后重新排序我的列。

但是SQL Server Management Studio不允许我这样做。我知道我不能这样做,并且在SQL中,列顺序几乎完全不相关。

我想知道的是,是怎么来的...我的意思是,我可以删除一个专栏......这与添加新专栏不一样吗?

我只是想了解发生了什么。我也很难找到相关的文档。如果有人能指出我的方向。

6 个答案:

答案 0 :(得分:23)

绝对可以。在SQL Server Management Studio中取消选中此选项:
工具>选项>设计师>防止保存需要表重新创建的更改。

Options dialog

答案 1 :(得分:7)

重新排序列与重新生成表基本相同,如果禁用需要重新创建的更改,则会解决此问题:

SELECT (fields in DESIRED order)
INTO MyNewTable
FROM OldTable

答案 2 :(得分:5)

您可能对this question的答案感兴趣。

至于为什么你不能重新排序列(除了发布的SSMS特定答案),我不确定你会找到一个规范的答案,除了SQL标准不包含这样做的编程语法 - 重新定义表模式(包括其列的顺序)的唯一方法是删除表并重新创建它。因此,任何提供“重新排序”列的管理应用程序很可能会在幕后进行(例如SSMS的设计视图,如链接问题中所指出的那样)。

如果 明确的原因是没有提供列重排序机制作为标准DDL的一部分,那么对SQL规范有更深入了解的人可能会与此相矛盾,但我只能猜测,因为查询定义了结果集中列的顺序,DBMSes根据它们各自的实现控制物理存储,逻辑列顺序基本上没有意义,并且不保证这样的机制。

答案 3 :(得分:1)

如果我的怀疑是正确的,您打开了一个设置,您需要关闭以允许更改需要重新创建表格才能保存。

打开SQL Management Studio并使用菜单转到工具 - >选项

在左侧的选项菜单中选择设计师

在右侧的“表选项”窗格中,确保取消选中“防止保存需要重新创建表的更改”设置旁边的复选框。

确认完成后,请尝试重新排序列。

答案 4 :(得分:1)

  

我想知道的是,是怎么来的...我的意思是,我可以删除一个专栏......这与添加新专栏不一样吗?

删除列是基于列名,而不是序号位置(第一/第二/第三/等列)。添加列始终附加到列列表的末尾。这加强了列的顺序与SQL操作之外的数据完全无关。我不知道你是怎么看待相似的......

没有SQL数据库我知道支持以特定顺序将列插入到现有表中。 PHPMyAdmin提供了一些功能,但是该功能正在创建一个具有所需列顺序的新表,将数据从旧表复制到新表,最后删除/删除旧表。

列顺序对操作没有任何好处......

答案 5 :(得分:0)

除非表没有数据且尚未投入生产,否则您不希望这样做!原因是它必须将现有记录输出到临时表,删除旧表,重命名临时表。对于生产中的现有表,这是一件非常糟糕的事情。无论如何依赖查询中的列顺序是愚蠢的,所以这是一个完全不必要的任务。这可能会导致巨大的痛苦,实际上没有任何收获。即使找到解决方法,也不要走这条路。