我需要一个SQL查询,在现有列之后添加一个新列,因此该列将按特定顺序添加。
如果有任何ALTER
查询,请建议我。
答案 0 :(得分:36)
Microsoft SQL(AFAIK)不允许您更改表并在特定列之后添加列。您最好的选择是使用Sql Server Management Studio,或者使用删除和重新添加表,或创建新表并手动移动数据。既不是很优雅。
然而MySQL确实:
ALTER TABLE mytable
ADD COLUMN new_column <type>
AFTER existing_column
答案 1 :(得分:20)
ALTER不会这样做,因为列顺序无关紧要用于存储或查询
如果是SQL Server,则必须使用SSMS表设计器来排列列,然后可以生成一个删除并重新创建表的脚本
2013年6月编辑
在此处链接到我的回答:Performance / Space implications when ordering SQL Server columns?
答案 2 :(得分:14)
这是可能的。
首先,只需按常规方式添加每列(作为最后一列)。
其次,在SQL Server Management Studio
进入工具=&gt;选项。
Under&#39; Designers&#39; Tab =&gt; &#39;表和数据库设计师&#39;菜单,取消选中&#39;阻止保存需要重新创建表的更改&#39;。
然后,右键单击您的表格并选择“设计”。 在&#39; Design&#39;模式只需拖动列即可对其进行排序。
别忘了保存。
答案 3 :(得分:3)
如果要更改Sql server中列的顺序,目前没有直接在SQL Server中执行此操作的方法。
查看http://blog.sqlauthority.com/2008/04/08/sql-server-change-order-of-column-in-database-tables/
您可以在编辑表格设计时更改顺序。
答案 4 :(得分:2)
首先通过SSMStudio将新列添加到旧表中。转到数据库&gt;&gt;表&gt;&gt;列。右键单击列并选择 new column 。按照向导。然后创建新表,其中列按所需顺序排列,如下所示:
select * into my_new_table from (
select old_col1, my_new_col, old_col2, old_col3
from my_old_table
) as A
;
然后根据需要通过SSMStudio重命名表。转到数据库&gt;&gt;表&gt;&gt;选择重命名。
答案 5 :(得分:0)
对于MS SQL Server,ALTER TABLE tablename ADD columnname INT
将起作用。当然,使用after
命令在MySQL中添加特定列之后的列是不可能的。
答案 6 :(得分:0)
根据我的研究,没有办法完全按照您想要的方式执行此操作。您可以手动重新创建表并复制数据,或者 SSMS 可以(并且将会)为您执行此操作(当您将列拖放到不同的顺序时,它会执行此操作)。 事实上,列的顺序无关紧要...... 作为替代解决方案,您可以按所需顺序选择所需数据。 例如,不要在 select 中使用星号 (*),而是按某种顺序指定列名... 假设 MyTable 有 col1、col2、col3、colNew 列。
代替:
SELECT * FROM MyTable
您可以使用:
SELECT col1, colNew, col2, col3 FROM MyTable
答案 7 :(得分:-4)
从任何时期选择*都是一个坏主意。 这就是为什么SSMS添加每个字段名称,即使有数百个,而不是select *。无论桌子有多大,它的效率都非常低。如果您不知道这些字段是什么,那么将它们从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 = ''