如何删除check约束?

t3irkdon  于 2021-08-09  发布在  Java
关注(0)|答案(1)|浏览(633)

在sql中使用alter很难删除check。有人能帮我吗?

  1. CREATE TABLE MyProject_COST (
  2. ID int(4) NOT NULL UNIQUE,
  3. detail varchar2(25) NOT NULL,
  4. cost int(6) CONSTRAINT cost_project CHECK(cost>=500)
  5. );
  6. ALTER TABLE MyProject_COST ALTER COLUMN Cost int(6)
r6l8ljro

r6l8ljro1#

甲骨文确实有一个 alter table ... drop constraint 这个的语法。
但是由于您创建了一个匿名约束,所以这很棘手-因为您不知道约束的名称。
一种方法是使用动态sql检索约束名称,并使用 execute immediate 命令:

  1. declare
  2. c_name varchar2(255 char);
  3. begin
  4. select c.constraint_name into c_name
  5. from all_constraints c
  6. join all_cons_columns cc
  7. on cc.table_name = c.table_name
  8. and cc.constraint_name = c.constraint_name
  9. where
  10. cc.table_name = 'MYPROJECT_COST'
  11. and cc.column_name ='COST'
  12. and c.constraint_type = 'C' ;
  13. if c_name is not null then
  14. execute immediate
  15. 'alter table myproject_cost drop constraint "' || c_name || '"';
  16. end if;
  17. end;
  18. /

db小提琴演示:

  1. create table myproject_cost (
  2. id int not null unique,
  3. detail varchar2(25) not null,
  4. cost int check(cost >= 500)
  5. );
  6. insert into MyProject_COST(id, detail, cost) values(1, 'foo', 0);
  7. -- ORA-02290: check constraint (FIDDLE_XUVVCZVSYWWROHKPBFUF.SYS_C0030623) violated
  8. declare
  9. c_name varchar2(255 char);
  10. begin
  11. select c.constraint_name into c_name
  12. from all_constraints c
  13. join all_cons_columns cc
  14. on cc.table_name = c.table_name
  15. and cc.constraint_name = c.constraint_name
  16. where
  17. cc.table_name = 'MYPROJECT_COST'
  18. and cc.column_name ='COST'
  19. and c.constraint_type = 'C' ;
  20. if c_name is not null then
  21. execute immediate
  22. 'alter table myproject_cost drop constraint "' || c_name || '"';
  23. end if;
  24. end;
  25. /
  26. -- 1 rows affected
  27. insert into MyProject_COST(id, detail, cost) values(1, 'foo', 0);
  28. -- 1 rows affected
展开查看全部

相关问题