我有一个自动生成的主键约束。其实关键是错的。它应该反对两列,而目前它反对一列。我需要在多个数据库上运行此脚本,因此每个数据库的约束名称可能不同。我需要获取约束名称,然后删除它,然后创建新的主键。
这是我到目前为止的脚本
DECLARE
con_name VARCHAR(255);
BEGIN
select constraint_name into con_name from all_constraints where table_name = 'MY_TABLE' and constraint_type = 'P';
EXECUTE immediate 'ALTER TABLE MY_TABLE drop constraint con_name';
EXECUTE immediate 'ALTER TABLE MY_TABLE ADD CONSTRAINT MT_PK PRIMARY KEY (REV, ID)';
COMMIT;
/
EXIT;
Run Code Online (Sandbox Code Playgroud)
但是我有一个问题,我认为它试图删除 con_name 而不是该变量中的值。
Error on script: Error number: -2443, Error Message: ORA-02443: Cannot drop constraint - nonexistent constraint
Run Code Online (Sandbox Code Playgroud)
有人可以帮忙吗?我基本上需要把pk放到这个表里。还有其他方法吗,或者我的方法是否正确。
谢谢
您的con_name变量超出了您正在执行的 DDL 语句的范围;您正在尝试删除名为 的约束con_name,而不是像您怀疑的那样以保留的值命名的约束。您不能在此处使用绑定变量,因此您需要连接名称:
DECLARE
con_name all_constraints.constraint_name%type;
BEGIN
select constraint_name into con_name
from all_constraints
where table_name = 'MY_TABLE' and constraint_type = 'P';
EXECUTE immediate 'ALTER TABLE MY_TABLE drop constraint ' || con_name;
EXECUTE immediate 'ALTER TABLE MY_TABLE ADD CONSTRAINT MT_PK PRIMARY KEY (REV, ID)';
END;
/
Run Code Online (Sandbox Code Playgroud)
正如尼古拉斯·克拉斯诺夫(Nicholas Krasnov)在评论中指出的那样,你根本不需要这样做;您可以删除主键而不指定其名称(也在语法图中显示),而无需使用动态 SQL 或 PL/SQL 块:
ALTER TABLE MY_TABLE DROP PRIMARY KEY;
ALTER TABLE MY_TABLE ADD CONSTRAINT MT_PK PRIMARY KEY (REV, ID);
Run Code Online (Sandbox Code Playgroud)
希望您还没有任何带有针对此 PK 的外键约束的表。
| 归档时间: |
|
| 查看次数: |
3482 次 |
| 最近记录: |