我想在SQL Server中的一个表中添加一列。我不希望它出现在表中的列列表的末尾...我实际上希望它在表中的其他位置(位置明智)。除了删除和重建(填充)表以完成此操作之外还有其他选择吗?我显然不希望丢失任何数据,但我更希望它不必在表定义的末尾有列。
谢谢,
取值
答案 0 :(得分:9)
表中的列顺序无关紧要 - 它纯粹是装饰性的
ALTER TABLE
没有扩展名允许您指定新列的序号位置(用于添加新列或移动现有列)。
有关该主题的更多信息,请参阅:
答案 1 :(得分:2)
简答: 我同意OMG小马,列顺序并不重要。如果您没有聚簇索引,请删除并重新创建表,而不是运行 ALTER TABLE x ADD col 。
答案很长: 如果您的表有相当数据(50Mb会想到),那么您最好重新创建表而不是 ALTER TABLE x ADD col 表的数据页分配计划在表中计算创建时间因此,当您添加列时,SQL Server通常会将新列的数据放在单独的页面中,并将现有数据页中的指针提交到您添加的列的新数据页。如果您要广泛使用新列,那么表IO将非常差,因为即使读取1行也需要读取至少2页。表扫描也会表现不佳,因为将始终遵循前向指针,导致在扫描期间通常顺序的表扫描在磁盘上来回跳转。
在这种情况下,最好重命名现有表,使用新列重新创建表,插入table_name选择col1,col2,'null或默认为新col',col3来自temp_renamed_table,最后删除旧表重命名。尽管从SQL开发人员的角度来看,与使用 ALTER TABLE 相比,数据页面组织得更好,IO也会更快。如果您有聚簇索引,则在添加列时将重新组织表,并且页面拆分的可能性较小。如果您有SQL Server 2008,也可以运行 ALTER TABLE x REBUILD ,没有聚集索引,并且有很多时间用户不使用您的表。如果不了解更多内容,很难评论您的索引策略。
这是重建表格的一个更好的理由,而不是像列顺序那样的化妆品。
答案 2 :(得分:1)
重新排列表格中的列是一种非常糟糕的做法。甚至不考虑尝试做这样的事情。如果您使用select *,使用了正确的编码实践(例如从不,我的意思是永远),则列顺序无关紧要。
如果您使用了select *并且更改了列的顺序,那么您更有可能破坏代码,因为查询可能不会期望Price作为第三列而是作为第二列而且可能会严重陷入困境很多东西。
此外,执行此操作的唯一方法是创建另一个表,移动数据,然后删除旧表并重命名第一个表。当然,如果你有FK,它们也必须被删除并重新创建。如果您拥有大量数据集并且可能会给用户带来问题,则会花费大量时间。
没有任何条件可以考虑为生产中的表格做这件事,因为它太冒险了。如果您处于设计的早期阶段,您可以考虑这样做。
答案 3 :(得分:-1)
ALTER TABLE my_table ADD COLUMN column_name VARCHAR(50) AFTER col_name;
用VARCHAR(50)替换你想要的任何def
http://dev.mysql.com/doc/refman/5.1/en/alter-table.html
编辑这当然是MySQL服务器的正确答案......但这不是OP想要的。