Oracle sql:Drop table列显示错误:标识符无效?

时间:2015-03-11 06:56:41

标签: oracle multiple-columns ddl alter-table

当我尝试在一个语句中删除多个列时出现此错误: -

    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 个答案:

答案 0 :(得分:4)

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

alter table table_name drop (col_name1, col_name2); 

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

答案 1 :(得分:1)

  

Drop table列显示错误:标识符无效?

     

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

您正在使用的alter语句中有两个不正确的内容。

    删除多列时不需要
  1. COLUMN 关键字。
  2. 您不需要双引号
  3. 使用双引号:

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

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

    关于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>
    

答案 2 :(得分:0)

您必须删除双引号。它们不是必需的,如果您想删除多个列,则必须删除关键字column

ALTER TABLE RLX_ROLES DROP (test,test_2);

有关alter语法的详细信息,请参阅here

答案 3 :(得分:0)

据推测,您无意中使用区分大小写的列名创建了表(通过使用双引号)。如果是这种情况,您必须使用双引号和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聚合函数将它们连接起来。