【问题标题】:Why can't I reorder my SQL Server columns?为什么我不能重新排序我的 SQL Server 列?
【发布时间】:2010-12-09 19:35:29
【问题描述】:

我有一张旧桌子,里面有 FK。我想添加一个新列。我想让这个新列成为我的主键。所以我想我可以将该列作为第一列插入,也可以将其插入到表格的末尾,然后重新排序。

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

我想知道的是,怎么会...

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

【问题讨论】:

  • 你能告诉我们你使用的是什么版本的sql server,你得到的确切错误信息是什么?我猜这可能是一个不允许您进行需要重新创建表的更改的设置。
  • 抱歉耽搁了,圣诞工作会耽误了我的工作嘿嘿。我正在使用 MSSQL Server 2008 R2(管理工作室)。错误消息是:“不允许保存更改。您所做的更改需要删除并重新创建以下表。您对无法重新创建的表进行了更改或启用了选项阻止保存需要重新创建表的更改。”
  • 这非常接近于重复,但实际上并不是重复,因为引用的问题没有询问或得到关于原因的答案。

标签: sql sql-server


【解决方案1】:

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

除非您知道其中的含义,否则请不要在生产环境中执行此操作!

【讨论】:

  • 希望它不用说,但无论如何我都会说出来。这可以杀死表。如果您去生产数据库附近的任何地方,我建议您在进行更改后立即重新打开该标志!
  • 我完全同意,特别是对于大桌子它可能真的有害。
  • 这对我的问题有效。我在表的属性中寻找这个选项。我当前的表有 66 行和 1 个语言表的 FK。我会试试看它是否会破坏我的东西。谢谢!!
【解决方案2】:

重新排序列与重新制作表格基本相同,如果需要重新创建的更改被禁用,这是解决方法:

SELECT (fields in DESIRED order)
INTO MyNewTable
FROM OldTable

【讨论】:

    【解决方案3】:

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

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

    如果有一个明确的理由不提供列重新排序机制作为标准 DDL 的一部分,那么对 SQL 规范有更深入了解的人可能会反驳这一点,但我只能推测,因为无论如何,查询在其结果集中定义列的顺序,并且 DBMS 根据其各自的实现来控制物理存储,逻辑列顺序本质上是没有意义的,并且不保证这种机制。

    【讨论】:

    • 列顺序在任何 SQL 语句的上下文中都没有提供任何价值这一事实对我来说是规范的——您可以选择任何您喜欢的列,以任何您想要的顺序。
    • 同意。我想我试图通过指出可能有也可能没有更明确的原因来限定我的陈述。但我同意我认为不需要有一个。
    • 我认为这是我得到的答案的封闭式。非常感谢!我认为如果没有逻辑上的需要,SQL 创建者不会包含导致几乎无用功能的功能是有道理的。
    • 通常,我会Select top 10 * 从表格中获取数据的要点。列的排序/分组可以帮助理解表格。我经常发现多年来添加了无数次的表格与具有逻辑排序列的表格相比,让新同事感到困惑。
    【解决方案4】:

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

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

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

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

    在您确认完成后,尝试重新排列您的列。

    【讨论】:

    • 确实有效。现在我需要知道它是否安全,以及为什么我们不能在不重新创建表的情况下执行此操作。谢谢
    【解决方案5】:

    我想知道的是,怎么会...

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

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

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

    【讨论】:

    • 确实为稍微有强迫症的开发者提供了好处,但是...... ;)
    • @djacobson:我不得不支持有这种强迫症要求的 DBA——浪费时间、金钱和资源。统计事实表明,你改变的越多,可能/将会出错的越多。
    • 汪。那真不幸。您的解决方案是编写一个脚本生成器,该生成器将为给定表生成一个新的CREATE TABLE 语句,其中列按所需顺序,以及相关的 drop-table 和 copy-data 语句,并在数据库上执行? :)
    • @djacobson:更糟糕的是——我们被要求编写和测试脚本,并提供说明……结果发现一些 DBA 会完全自己编写。我们必须 100% 遵守指示,以防可以正确归咎于失败的责任。
    • 好吧,我看到 drop 与 add 相同,为了删除一列,其他列将按其顺序“移动”。并且不在末尾添加一列,也会按顺序“移动”其他列。我同意,除了 GUI 中所述表格的可读性之外,这对其他任何事情都没有好处。但是在 sql 引擎的深处,是什么阻止了我们这样做......
    【解决方案6】:

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

    【讨论】:

    • 嗨 HLGEM,请仔细阅读我的帖子,我真的不想这样做 :) 我真正想知道为什么有人不能这样做。但是谢谢你的警告,呵呵:)
    • 您只能通过创建表并将数据移动到其中来完成。这就是为什么这是一个糟糕的主意,并且通常不允许这样做,因为如果这样做,它会给现有的数据库访问带来巨大的问题。
    猜你喜欢
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 2022-10-23
    相关资源
    最近更新 更多