我有一个自动生成的主键构造。关键是错误的。它应该是两列,目前它是一列。我需要在多个数据库上运行此脚本,因此每个数据库的约束名称可能不同。我需要获取约束名称,然后删除它,然后创建新的主键。
这是我到目前为止的脚本
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;
但是我有一个问题,我认为它试图删除con_name而不是该变量中的值。
Error on script: Error number: -2443, Error Message: ORA-02443: Cannot drop constraint - nonexistent constraint
有人可以帮忙吗?我基本上需要删除此表中的pk。有没有其他方式或我的方法是正确的方式。
由于
答案 0 :(得分:3)
您的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;
/
正如尼古拉斯·克拉斯诺夫(Nicholas Krasnov)在评论中指出的那样,你根本不需要这样做;你可以drop the primary key without specifying its name,不使用动态SQL或PL / SQL块:
ALTER TABLE MY_TABLE DROP PRIMARY KEY;
ALTER TABLE MY_TABLE ADD CONSTRAINT MT_PK PRIMARY KEY (REV, ID);
希望您还没有任何针对此PK的外键约束表。