【问题标题】:How do you ADD and DROP columns in a single ALTER TABLE如何在单个 ALTER TABLE 中添加和删除列
【发布时间】:2013-04-06 01:16:36
【问题描述】:

我尝试了以下方法,但出现语法错误

ALTER TABLE Grades ( 
DROP COLUMN (Student_FamilyName, Student_Name),
ADD Student_id INT );

是否可以在同一个ALTER TABLE 语句中执行DROPADD

【问题讨论】:

  • 你不能用一个 alter 语句来做 drop 和 create,分开它
  • 你切换到 PostgreSQL(咳咳),它支持 multiple changes 作为标准 SQL 语法的扩展。 (尽管我经常使用 PostgreSQL,但我通常编写的 SQL 会避免扩展。)
  • 您使用的是哪个 DBMS?甲骨文? DB2?

标签: sql syntax alter-table


【解决方案1】:

如果你的数据库是 MySQL,你可以这样做:

ALTER TABLE Grades
    DROP COLUMN Student_FamilyName, 
    DROP COLUMN Student_Name,
    ADD Student_id INT;

适用于 MySQL 5.5.5

【讨论】:

    【解决方案2】:

    如果你看ALTER TABLE SYTAX

    你会看到这个

    ALTER TABLE [ database_name . [ schema_name ] . | schema_name . ] table_name 
    { 
        ALTER COLUMN column_name 
        { 
            [ type_schema_name. ] type_name [ ( { precision [ , scale ] 
                | max | xml_schema_collection } ) ] 
            [ COLLATE collation_name ] 
            [ NULL | NOT NULL ] [ SPARSE ]
    
        | {ADD | DROP } 
            { ROWGUIDCOL | PERSISTED | NOT FOR REPLICATION | SPARSE }
        } 
            | [ WITH { CHECK | NOCHECK } ]
    
        | ADD 
        { 
            <column_definition>
          | <computed_column_definition>
          | <table_constraint> 
          | <column_set_definition> 
        } [ ,...n ]
    
        | DROP 
         {
             [ CONSTRAINT ] 
             { 
                  constraint_name 
                  [ WITH 
                   ( <drop_clustered_constraint_option> [ ,...n ] ) 
                  ] 
              } [ ,...n ]
              | COLUMN 
              {
                  column_name 
              } [ ,...n ]
         } [ ,...n ]
    

    这可以简化为

    ALTER TABLE { ALTER COLUMN column_name | ADD | DROP }

    Transact-SQL Syntax Conventions (Transact-SQL)| (竖线)

    分隔用括号或大括号括起来的语法项。您只能使用其中一项。

    因此您不能在单个语句中更改、删除或添加。你也有不起作用的括号和逗号。所以你需要

    ALTER TABLE Grades DROP COLUMN (Student_FamilyName, Student_Name);
    ALTER TABLE Grades ADD  Student_id INT;
    

    如果你需要它们成为一个原子动作,你只需要包装在事务中

    【讨论】:

    • "如果您需要它们成为原子操作,您只需要包装在事务中" - Oracle DDL 不会导致隐式提交吗?
    • 或在 T-SQL 中:ALTER TABLE Grades DROP COLUMN Student_FamilyName, COLUMN Student_Name;
    猜你喜欢
    • 2011-09-04
    • 2011-09-14
    • 1970-01-01
    • 2019-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多