删除自动生成的约束名称

时间:2014-08-18 10:41:41

标签: oracle oracle11g

我有一个自动生成的主键构造。关键是错误的。它应该是两列,目前它是一列。我需要在多个数据库上运行此脚本,因此每个数据库的约束名称可能不同。我需要获取约束名称,然后删除它,然后创建新的主键。

这是我到目前为止的脚本

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。有没有其他方式或我的方法是正确的方式。

由于

1 个答案:

答案 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的外键约束表。