【问题标题】:Alter Table Add Column Syntax更改表添加列语法
【发布时间】:2009-04-27 16:57:24
【问题描述】:

我正在尝试以编程方式将标识列添加到表Employees。不知道我的语法有什么问题。

ALTER TABLE Employees
  ADD COLUMN EmployeeID int NOT NULL IDENTITY (1, 1)

ALTER TABLE Employees ADD CONSTRAINT
    PK_Employees PRIMARY KEY CLUSTERED 
    (
      EmployeeID
    ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, 
    ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

我做错了什么?我试图导出脚本,但 SQL Mgmt Studio 做了整个 Temp Table 重命名的事情。

更新: 我认为第一个语句“关键字'COLUMN'附近的语法不正确”令人窒息。

【问题讨论】:

    标签: sql sql-server tsql ddl


    【解决方案1】:

    只需从ADD COLUMN 中删除COLUMN

    ALTER TABLE Employees
      ADD EmployeeID numeric NOT NULL IDENTITY (1, 1)
    
    ALTER TABLE Employees ADD CONSTRAINT
            PK_Employees PRIMARY KEY CLUSTERED 
            (
              EmployeeID
            ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, 
            ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    

    【讨论】:

    • 澄清一下,“COLUMN”关键字仅在 MySQL 中有效(但不是必需的)。
    • @ethanbustad 对 DB2 和 Postgres 也有效。
    • 可笑的是,他们不只是忽略 column 关键字并使其像其他所有数据库一样工作。
    • 仅供参考,在这种情况下,Oracle 的行为方式与 SQL Server 相同 - 两者都不允许在 ADD 语句中使用 COLUMN
    【解决方案2】:

    这就是向表中添加新列的方式

    ALTER TABLE [tableName]
    ADD ColumnName Datatype
    

    例如

    ALTER TABLE [Emp]
    ADD Sr_No Int
    

    如果你想让它自动递增

    ALTER TABLE [Emp]
    ADD Sr_No Int IDENTITY(1,1) NOT NULL
    

    【讨论】:

      【解决方案3】:

      将列添加到表中的正确语法是:

      ALTER TABLE table_name
        ADD column_name column-definition;
      

      你的情况是:

      ALTER TABLE Employees
        ADD EmployeeID int NOT NULL IDENTITY (1, 1)
      

      要添加多列,请使用括号:

      ALTER TABLE table_name
        ADD (column_1 column-definition,
             column_2 column-definition,
             ...
             column_n column_definition);
      

      SQL SERVER 中的COLUMN 关键字仅用于修改:

      ALTER TABLE table_name
        ALTER COLUMN column_name column_type;
      

      【讨论】:

      • 感谢您提及多个专栏。
      【解决方案4】:

      如果您尝试将列添加到表的开头,它可能会重命名临时表(因为这比更改顺序更容易)。此外,如果Employees表中有数据,则必须执行insert select *才能计算EmployeeID。

      【讨论】:

      • “更容易改变顺序” - 你的意思是可以(虽然更难)改变列的顺序而不重新创建表(通过临时表)?跨度>
      • 在关系数据库中,您永远不需要列的序数,所以如果您想整齐地排列列,问题是为什么?如果列序数如此重要,为什么没有一个简单的函数来交换或修复列的序数?原因是它设计的顺序无关紧要。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多