代码之家  ›  专栏  ›  技术社区  ›  Soham Banerjee

Oracle sql:删除表列显示错误:标识符无效?[已关闭]

  •  0
  • Soham Banerjee  · 技术社区  · 10 年前

    当我试图在一条语句中删除多个列时,会出现以下错误:-

        ALTER TABLE "RLX_ROLES" DROP COLUMN ("test","test_2");
    

    但如果我一个接一个地放下它们,它就会奏效:-

        ALTER TABLE "RLX_ROLES" DROP COLUMN "test";
        ALTER TABLE "RLX_ROLES" DROP COLUMN "test_2";
    

    为什么?我的语法不正确吗?

    编辑:- 我也尝试过:-

        ALTER TABLE RLX_ROLES DROP (test,test_2);
    

        ALTER TABLE RLX_ROLES DROP COLUMN (test,test_2);
    

    更新:-

    很明显,我把其中一个列名拼错了,很抱歉。

    4 回复  |  直到 10 年前
        1
  •  4
  •   Francesco    10 年前

    必须使用以下语句删除多个列:

    alter table table_name drop (col_name1, col_name2); 
    

    然后,您必须删除语句中的“column”关键字。

        2
  •  1
  •   Lalit Kumar B    10 年前

    删除表列显示错误:标识符无效?

    ALTER TABLE“RLX_ROLES”DROP COLUMN(“test”,“test_2”);

    您使用的alter语句中有两个错误。

    1. 删除多个列不需要关键字。
    2. 你不需要 双引号 .

    使用双引号:

    SQL> ALTER TABLE t DROP ("b", "c");
    ALTER TABLE t DROP ("b", "c")
                             *
    ERROR at line 1:
    ORA-00904: "c": invalid identifier
    
    
    SQL>
    

    因此,删除列关键字和双引号。

    所有这些都是关于 Removing Columns from Tables .

    从表中删除列

    发出ALTER TABLE时。。。DROP COLUMN语句,该列 描述符和与目标列关联的数据将被删除 从表中的每一行。可以用一个删除多个列 陈述

    正在删除 单柱 :

    SQL> CREATE TABLE t(
      2  A NUMBER,
      3  b NUMBER,
      4  c NUMBER
      5  );
    
    Table created.
    
    SQL>
    SQL> ALTER TABLE t DROP column c;
    
    Table altered.
    

    滴水 多个列 :

    SQL> drop table t purge;
    
    Table dropped.
    
    SQL> CREATE TABLE t(
      2  a NUMBER,
      3  b NUMBER,
      4  c NUMBER
      5  );
    
    Table created.
    
    SQL>
    SQL> ALTER TABLE t DROP (b, c);
    
    Table altered.
    
    SQL>
    
        3
  •  0
  •   Frank Schmitt    10 年前

    可能您无意中创建了具有区分大小写的列名的表(使用双引号)。如果是这样的话,你必须使用双引号和正确的拼写 DROP 声明:

    create table RLX_ROLES("test" number, "Test_2" number, test3 number);
    
    alter table RLX_ROLES drop ("Test_2","test");
    

    若要生成SQL语句以删除拼写正确的所有列,可以使用此语句(请注意,如果不更改此语句的运行方式,将引发错误,因为无法删除表中的所有列):

    select 'alter table ' || table_name ||
      ' drop (' || 
      listagg('"' || utc.column_name || '"', ',') within group (order by utc.column_name) ||
      ');'
    from user_tab_cols utc
    where table_name = 'RLX_ROLES'
    group by table_name;
    

    这将查询 user_tab_cols 字典视图获取RLX_ROLES表的所有列名,并使用 LISTAGG 聚合函数来连接它们。

        4
  •  0
  •   Frank Schmitt    10 年前

    您必须删除双引号。不需要它们,您必须删除关键字 column 如果您希望删除多个列。

    ALTER TABLE RLX_ROLES DROP (test,test_2);
    

    看见 here 有关的详细信息 alter 语法。