如何从Oracle数据库中基于列删除约束?

3
有没有一种方法可以基于列名删除约束(唯一索引)?
我想要做的是删除列名为'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个回答

7

我原本认为这不可能只用一条语句实现,但事实证明可以,正如文档中的示例所示

ALTER TABLE MY_TABLE DROP UNIQUE(col1, col2);

一个完整的例子: ALTER TABLE MY_TABLE ADD UNIQUE (col1, col2);
(注:该句为 IT 技术相关内容翻译,仅供参考)
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
  1. 执行SELECT * FROM USER_CONS_COLUMNSALL_CONS_COLUMNS。这将为您提供所有者、表和列组合的约束名称。
  2. 对于一个列名返回多行,根据需要使用约束名称在ALTER TABLE ... DROP CONSTRAINT...语法中进行操作。
  3. 如果您绝对确定可以删除所有约束,请使用动态SQL在循环中执行此操作。

这将为您提供额外的保护层,以防止意外删除所需的约束。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接