SQL Server添加列

问题描述:

我想将列添加到SQL Server中的一个表中。我不希望它在列表中列出的末尾......我实际上希望它在表格中的其他位置(位置明智)。除了删除和重建(填充)表以完成此操作之外,还有其他选项吗?我显然不希望失去任何数据,但我宁愿不必在表定义的末尾添加列。SQL Server添加列

感谢,

小号

简短的回答: 我OMG小马同意,列的顺序并不重要。如果您没有聚簇索引,请删除并重新创建表,而不是运行ALTER TABLE x ADD col

龙答: 如果你的表有数据(50MB的想到的),那么你会好起来重新创建表,而不是ALTER TABLE x添加山坳的数据页分配方案的公平的位表是在创建表时进行计算的,所以当您添加一列时,SQL Server通常会将您的新列数据放入单独的页面中,并将现有数据页面中的指针指向您添加的列的新数据页面。如果你打算广泛使用新列,那么你的表IO将会很差,因为即使读一行也需要读至少2页。表扫描也将表现不佳,因为始终会遵循前向指针,导致通常顺序的表扫描在读取期间在磁盘上来回跳动。

在这种情况下,最好重新命名现有的表格,用新列重新创建表格,插入到table_name中选择col1,col2,'null或默认为新col',col3 from temp_renamed_table,最后删除旧表格你改名了。尽管从SQL开发人员的角度来看,数据页面的组织性会更好,并且IO的速度会更快,但与使用ALTER TABLE时相同。如果你有一个聚集索引,当你添加列和页面拆分的可能性较小时,表格将被重新组织。如果你有SQL Server 2008,你也可以运行ALTER TABLE x REBUILD,当用户不使用你的表时没有聚集索引和大量时间。不知道更多,很难评论你的索引策略。

这是一个更好的理由来重新创建表,而不是像列顺序美容。

+0

沃宾爵士,这是我听到的第一个“新专栏”将以这种方式添加。你可以发表一些讨论这个的在线参考吗? (这听起来很合理,我只想获得更多有关这个主题的深度和细节,我不知道如何谷歌主题。) – 2010-11-11 18:53:55

+0

我喜欢菲利普希望看到你有这个文件...会很有帮助。 – scarpacci 2010-11-11 19:09:37

+0

你之后的概念是'页面拆分'和'转发指针'。这里有两个关于如何在桌面上找到它们的技巧的绝佳讨论,包括实验以确定它们何时发生。 http://bit.ly/bIrQvp和http://bit.ly/df3Mp0 以下是对现有表中添加列的结果发生的页面拆分的具体参考。 http://bit.ly/dAxPs0 – 2010-11-12 11:40:01

ALTER TABLE my_table ADD COLUMN column_name VARCHAR(50) AFTER col_name; 

代任何高清你想为VARCHAR(50)

http://dev.mysql.com/doc/refman/5.1/en/alter-table.html

编辑当然,这是一个MySQL的正确答案服务器...但这不是OP想要的。

+2

标记为“sql server”的问题... – 2010-11-11 16:47:20

+2

这对于SqlServer不起作用。 – GendoIkari 2010-11-11 16:48:08

+4

@OMG小马,@Gendolkari我以为mysqld是一个SQL服务器。无论如何,我今天无法得到任何东西,所以我去了酒吧。 – 2010-11-11 16:52:01

表中的列顺序是无关紧要的 - 它纯粹是化妆品。
ALTER TABLE没有扩展名,允许您指定新列的序号位置(用于添加新列或移动现有列)。

欲了解更多关于这个问题,请参见:

+1

感谢OMG Ponies ....你总是提供有用的信息 – scarpacci 2010-11-11 16:52:35

+0

除了你总是可以创建一个按需要重新排列列顺序的视图。 – 2010-11-11 19:24:39

重新排列表中的列是非常糟糕的做法。甚至不考虑尝试做这样的事情。如果您使用了正确的编码实践(如从不,我的意思是从不),那么列顺序是无关紧要的。

如果您已经使用select *并且更改了列的顺序,那么您更有可能破坏代码,因为查询可能并不期望Price作为第三列而是作为第二列,并且可能会严重混乱做了很多事情。

此外,唯一的方法是创建另一个表,移动数据,然后删除旧表并重命名第一个表。当然,如果你有FK,他们也必须被丢弃和重新创建。如果您拥有大量数据并且可能会给用户带来问题,则需要很长时间。

有没有这种情况下,你会考虑这样做的表在生产中,因为它太冒险了。如果你处于设计的早期阶段,你可以考虑这样做。