为啥 SSMS 在添加列时不智能?

Posted

技术标签:

【中文标题】为啥 SSMS 在添加列时不智能?【英文标题】:Why isn't SSMS smart when it comes to adding columns?为什么 SSMS 在添加列时不智能? 【发布时间】:2010-02-22 20:23:02 【问题描述】:

每当我想向表中添加一列时,它通常是这样的:

    启动 SQL Server Management Studio (SSMS) 在要添加列的表上选择“设计” 将新列添加到表中 保存 收到 SSMS 无法保存的错误,因为它需要删除表(它不能保存,因为表上有外键)。 因为我忘记这是 SSMS 无法做到的事情而感到沮丧 手动构造一个alter table命令来添加列 继续生活。

这次我在数字 6 和 7 之间添加了一个步骤。我想我会问为什么 SSMS 不能创建一个简单的 alter table 语句来添加我的新列。

(以防万一,我正在针对 SQL Server 2008 运行 SSMS 2008。)

【问题讨论】:

因为这是我们都必须忍受的垃圾。 (一旦你使用了 pgadmin3,SSMS 就显得很悲伤) 它总是为我生成 CONSTRAINT 下降,也许你有一个选项集可以防止这种情况发生? @KM,他说它产生了下降,但由于外键限制,它不会下降。他(和我)想知道的是为什么它必须删除表来添加一列 只是出于好奇 - 您是在表格末尾添加新列,还是介于两者之间? SQL Server 并没有真正的“列顺序”的概念——所以如果你在表中间插入一个新列,它所能做的就是删除旧表,用你的列顺序重新创建新表想要,然后把数据复制过来。如果对表有 FK 约束,第 1 步将失败...... 这个故事的寓意是:忘记 SSMS 的交互式设计器,改用 T-SQL 语句,不要拘泥于列顺序 - 它与 SQL 完全无关,只与人类相关。 T-SQL ALTER TABLE xyz ADD newcolumnname 将(几乎)始终有效 - 问题已解决 【参考方案1】:

或者,您可以转到工具-->选项-->设计器-->表和数据库设计器并取消选中“防止保存需要重新创建表的更改”

问题解决了。

这是来自 MSDN 的解释:http://support.microsoft.com/default.aspx/kb/956176。

当您更改表格时 改变元数据结构 表,然后你保存表, 该表必须基于重新创建 这些变化。

【讨论】:

@Alison: "@KM,他说它产生了丢弃,但由于外键限制它不会丢弃。他(和我)想知道的是为什么它必须丢弃表添加一列” 啊,它被列为“错误”,他们建议使用 T-SQL 来更改表而不是 SSMS.. @Earlz:你有“Bug”列表的链接吗?如果是这样,请将其发布为答案。 @Vaccano,这个答案中的链接说这是一个错误。不好的是它在 2005 年和 2008 年都受到了影响,而微软似乎仍然没有修复它的打算。

以上是关于为啥 SSMS 在添加列时不智能?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 InnoDB 为外键列添加索引

为啥 Django 在添加新列时会删除 SQL DEFAULT 约束?

在选择列时添加新行 # 取决于循环 #

添加新列时在alembic中设置列顺序

如何在使用 Sequelize 更改列或添加新列时更新迁移文件

SQLITE 在alter表添加列时怎么判断表中是不是已经存在列