【发布时间】:2011-06-11 13:42:04
【问题描述】:
我需要一个 SQL 查询,它在现有列之后添加一个新列,因此该列将按特定顺序添加。
如果有任何ALTER 查询可以这样做,请建议我。
【问题讨论】:
-
哪个版本的 SQL? (MysQl、SQL Server 等)
标签: sql sql-server sql-server-2005
我需要一个 SQL 查询,它在现有列之后添加一个新列,因此该列将按特定顺序添加。
如果有任何ALTER 查询可以这样做,请建议我。
【问题讨论】:
标签: sql sql-server sql-server-2005
Microsoft SQL (AFAIK) 不允许您更改表并在特定列之后添加列。您最好的选择是使用 Sql Server Management Studio,或者尝试删除并重新添加表,或者创建一个新表并手动移动数据。两者都不是很优雅。
MySQL 但是:
ALTER TABLE mytable
ADD COLUMN new_column <type>
AFTER existing_column
【讨论】:
这是可能的。
首先,以通常的方式添加每一列(作为最后一列)。
其次,在SQL Server Management Studio 进入工具 => 选项。
在“设计器”选项卡 =>“表和数据库设计器”菜单下,取消选中“防止保存需要重新创建表的更改”选项。
然后,右键单击您的表格并选择“设计”。 在“设计”模式下,只需拖动列即可对其进行排序。
别忘了保存。
【讨论】:
ALTER 不会这样做,因为列顺序不重要对于存储或查询
如果是 SQL Server,您必须使用 SSMS 表设计器来排列列,然后生成一个删除并重新创建表的脚本
2013 年 6 月编辑
在此处交叉链接到我的答案:Performance / Space implications when ordering SQL Server columns?
【讨论】:
SELECT * FROM some_table 的结果时,列的顺序很重要。 OP 没有说明为什么这个问题对他或她很重要,所以我认为这是一个不太完美的答案。
如果你想改变 Sql server 中列的顺序,目前在 SQL Server 中没有直接的方法。
看看http://blog.sqlauthority.com/2008/04/08/sql-server-change-order-of-column-in-database-tables/
您可以在编辑表格设计时更改顺序。
【讨论】:
首先通过 SSMStudio 将新列添加到旧表中。转到数据库>>表>>列。右键单击列并选择新列。按照向导。然后创建新表,其中的列按如下顺序排列:
select * into my_new_table from (
select old_col1, my_new_col, old_col2, old_col3
from my_old_table
) as A
;
然后通过 SSMStudio 根据需要重命名表。转到数据库>>表>>选择重命名。
【讨论】:
根据我的研究,没有办法完全按照您想要的方式执行此操作。您可以手动重新创建表并复制数据,或者 SSMS 可以(并且将会)为您执行此操作(当您将列拖放到不同的顺序时,它会执行此操作)。 事实上,列的顺序无关紧要...... 作为替代解决方案,您可以按所需顺序选择所需数据。 例如,不要在选择中使用星号 (*),而是按某种顺序指定列名... 假设 MyTable 有 col1、col2、col3、colNew 列。
代替:
SELECT * FROM MyTable
你可以使用:
SELECT col1, colNew, col2, col3 FROM MyTable
【讨论】:
从任何东西中选择 * 是个坏主意,句号。 这就是为什么 SSMS 会添加每个字段名称,即使有数百个,而不是选择 *。无论表有多大,它的效率都非常低。如果您不知道这些字段是什么,将它们从 INFORMATION_SCHEMA 数据库中提取出来比选择 * 更有效。
更好的查询是:
SELECT
COLUMN_NAME,
Case
When DATA_TYPE In ('varchar', 'char', 'nchar', 'nvarchar', 'binary')
Then convert(varchar(MAX), CHARACTER_MAXIMUM_LENGTH)
When DATA_TYPE In ('numeric', 'int', 'smallint', 'bigint', 'tinyint')
Then convert(varchar(MAX), NUMERIC_PRECISION)
When DATA_TYPE = 'bit'
Then convert(varchar(MAX), 1)
When DATA_TYPE IN ('decimal', 'float')
Then convert(varchar(MAX), Concat(Concat(NUMERIC_PRECISION, ', '), NUMERIC_SCALE))
When DATA_TYPE IN ('date', 'datetime', 'smalldatetime', 'time', 'timestamp')
Then ''
End As DATALEN,
DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
Where
TABLE_NAME = ''
【讨论】: