如何根据oracle数据库中的列删除约束?

时间:2015-02-16 15:29:33

标签: oracle constraints

是否有办法根据列名删除约束(唯一索引)?

我想要做的是删除columna name为name和name_type的约束。

ALTER TABLE MY_TABLE DROP CONSTRAINT NAME_OF_CONSTRAINT;

我没有名字,所以我想这样做......

ALTER TABLE MY_TABLE DROP CONSTRAINT **WHERE COLUMN = col1 AND column = col2**

在约束上执行类似操作的任何语法。

2 个答案:

答案 0 :(得分:5)

我认为这不可能只用一个声明,但事实证明它是如in the examples in the documentation所示:

ALTER TABLE MY_TABLE DROP UNIQUE(col1, col2);

一个完整的例子:     ALTER TABLE MY_TABLE ADD UNIQUE(col1,col2);

Table my_table altered.

SELECT CONSTRAINT_NAME, INDEX_NAME
FROM USER_CONSTRAINTS
WHERE TABLE_NAME = 'MY_TABLE';

CONSTRAINT_NAME                INDEX_NAME                    
------------------------------ ------------------------------
SYS_C0092455                   SYS_C0092455                   

ALTER TABLE MY_TABLE DROP UNIQUE(col1, col2);

Table my_table altered.

SELECT CONSTRAINT_NAME, INDEX_NAME
FROM USER_CONSTRAINTS
WHERE TABLE_NAME = 'MY_TABLE';

no rows selected

另一种方法是查询USER_CONSTRAINTSUSER_CONS_COLUMNS视图以查找匹配的约束名称 - 可能是系统生成的,或者您已经知道它 - 然后使用该名称。如果您需要以脚本形式执行此操作,则可以在PL / SQL块中进行查询,并将找到的约束名称插入动态ALTER TABLE语句中。

答案 1 :(得分:0)

  1. 执行SELECT * FROM USER_CONS_COLUMNSALL_CONS_COLUMNS。这将为您提供所有者,表和列组合的约束名称。
  2. 在为列名返回的多行中,根据需要使用ALTER TABLE ... DROP CONSTRAINT...语法中的约束名称。
  3. 如果您完全确定可以删除所有行,请使用动态sql对循环中的所有行执行此操作。
  4. 这将为您提供额外的保护层,以便您不会意外删除所需的约束。