【问题标题】:SQL Query to add a new column after an existing column in SQL Server 2005SQL Query 在 SQL Server 2005 中的现有列之后添加新列
【发布时间】:2011-06-11 13:42:04
【问题描述】:

我需要一个 SQL 查询,它在现有列之后添加一个新列,因此该列将按特定顺序添加。

如果有任何ALTER 查询可以这样做,请建议我。

【问题讨论】:

  • 哪个版本的 SQL? (MysQl、SQL Server 等)

标签: sql sql-server sql-server-2005


【解决方案1】:

Microsoft SQL (AFAIK) 不允许您更改表并在特定列之后添加列。您最好的选择是使用 Sql Server Management Studio,或者尝试删除并重新添加表,或者创建一个新表并手动移动数据。两者都不是很优雅。

MySQL 但是:

ALTER TABLE mytable
ADD COLUMN  new_column <type>
AFTER       existing_column

【讨论】:

    【解决方案2】:

    这是可能的。

    首先,以通常的方式添加每一列(作为最后一列)。

    其次,在SQL Server Management Studio 进入工具 => 选项。

    在“设计器”选项卡 =>“表和数据库设计器”菜单下,取消选中“防止保存需要重新创建表的更改”选项。

    然后,右键单击您的表格并选择“设计”。 在“设计”模式下,只需拖动列即可对其进行排序。

    别忘了保存。

    【讨论】:

    • OP 要求 SQL 查询来执行此操作。您的建议是使用 Management Studio。
    • +1 这有助于我通过关闭“防止保存”选项来完成它。因此不需要查询(无论如何这是不可能的)。
    • 谢谢。你帮我解决了使用设计器更新表格的问题
    • 我如何收藏答案而不是问题?毫无疑问,我知道我需要再次找到此选项。
    【解决方案3】:

    ALTER 不会这样做,因为列顺序不重要对于存储或查询

    如果是 SQL Server,您必须使用 SSMS 表设计器来排列列,然后生成一个删除并重新创建表的脚本

    2013 年 6 月编辑

    在此处交叉链接到我的答案:Performance / Space implications when ordering SQL Server columns?

    【讨论】:

    • 列顺序在处理批量插入时很重要
    • 谢谢。节省了我浪费更多时间试图弄清楚如何让 MS SQL 产品做到这一点。
    • 在导出SELECT * FROM some_table 的结果时,列的顺序很重要。 OP 没有说明为什么这个问题对他或她很重要,所以我认为这是一个不太完美的答案。
    • @gbn 除非您在使用 openrowset(BULK
    【解决方案4】:

    如果你想改变 Sql server 中列的顺序,目前在 SQL Server 中没有直接的方法。

    看看http://blog.sqlauthority.com/2008/04/08/sql-server-change-order-of-column-in-database-tables/

    您可以在编辑表格设计时更改顺序。

    【讨论】:

      【解决方案5】:

      首先通过 SSMStudio 将新列添加到旧表中。转到数据库>>表>>列。右键单击列并选择新列。按照向导。然后创建新表,其中的列按如下顺序排列:

      select * into my_new_table from (
      select old_col1, my_new_col, old_col2, old_col3
      from my_old_table 
      ) as A
      ;
      

      然后通过 SSMStudio 根据需要重命名表。转到数据库>>表>>选择重命名。

      【讨论】:

        【解决方案6】:

        根据我的研究,没有办法完全按照您想要的方式执行此操作。您可以手动重新创建表并复制数据,或者 SSMS 可以(并且将会)为您执行此操作(当您将列拖放到不同的顺序时,它会执行此操作)。 事实上,列的顺序无关紧要...... 作为替代解决方案,您可以按所需顺序选择所需数据。 例如,不要在选择中使用星号 (*),而是按某种顺序指定列名... 假设 MyTablecol1、col2、col3、colNew 列。

        代替:

        SELECT * FROM MyTable
        

        你可以使用:

        SELECT col1, colNew, col2, col3 FROM MyTable
        

        【讨论】:

          【解决方案7】:

          从任何东西中选择 * 是个坏主意,句号。 这就是为什么 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 = ''
          

          【讨论】:

          • 几乎被否决了,因为这并没有直接回答这个问题。但我认为您想说的是,仅当您使用 select * 时,顺序才重要,这通常是没有必要或好的。
          猜你喜欢
          • 2011-02-23
          • 1970-01-01
          • 2012-05-07
          • 2011-06-24
          • 1970-01-01
          • 1970-01-01
          • 2022-10-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多