【问题标题】:ADD CONSTRAINT IF EXISTS (Oracle 11g, Postgres 8)如果存在则添加约束(Oracle 11g,Postgres 8)
【发布时间】:2014-07-17 20:09:36
【问题描述】:

我很难编写一个脚本来删除某些数据库中的旧约束,然后用新的引用创建新的约束。

问题是数据库不相等。

例如:swpmnh 数据库具有 fk_cmp_solicitaca_rh_contrat 约束,但 swpmcs 数据库没有。因此,如果我执行脚本,我会遇到错误并且不会提交。

我知道 Postgres 9.x 有可能做DROP CONSTRAINT IF EXISTS,但是 Postgres 8.x 和 Oracle 11g 都没有这个功能。

我在SQL工作和学习大约只有3个月,我知道这是一件简单的事情,但对我来说却是个问题。

【问题讨论】:

  • 数据库存在差异,无法绕过。我注意到的一件事是他们俩都在不断寻找错误,所以只需输入两次“相同”的代码,每人一个;)
  • 数据库仍然存在差异,想法是让它们平等,随着时间的推移。没看懂你的意思,抱歉。在脚本的顶部,我放置了“BEGIN”,最后放置了“COMMIT”。所以,如果我有任何错误,它不会执行任何操作
  • 所有 Postgres 8.x 版本的生命周期结束(从现在起,8.4 将仅支持 2 个月)。因此,绝对没有理由将 Postgres 8.x 用于任何新事物
  • 我通常会做脚本来创建数据库结构,所以不需要提交,这让我可以作弊;我根本没有任何提交。
  • 可以使用宏处理器并生成 2 个不同的脚本,一个用于 postgresql,一个用于来自同一源的 oracle...每个 C 编译器都带有一个,或者您可以使用 m4 之类的东西...不确定我会推荐它;希望有人有更好的主意

标签: sql oracle postgresql constraints exists


【解决方案1】:

这是您将得到的错误:

SQL> alter table my_tab drop constraint my_cons;
alter table my_tab drop constraint my_cons
                                   *
ERROR at line 1:
ORA-02443: Cannot drop constraint  - nonexistent constraint

您可以在 PL/SQL 中捕获 ORA-02443 错误并忽略它(使用动态 SQL):

  1  declare
  2     e exception;
  3     pragma exception_init (e, -2443);
  4  begin
  5     execute immediate 'alter table my_tab drop constraint my_cons';
  6  exception
  7     when e then null;
  8* end;
SQL> /

PL/SQL procedure successfully completed.

这有点冗长,所以你可以创建一个方便的过程:

create or replace procedure drop_constraint (p_table varchar2, p_constraint varchar2) is
   e exception;
   pragma exception_init (e, -2443);
begin
   execute immediate 'alter table ' || p_table || ' drop constraint '||p_constraint;
exception
   when e then null;
end;

然后在需要时使用它:

execute drop_constraint ('my_tab', 'my_cons1');
execute drop_constraint ('my_tab', 'my_cons2');
execute drop_constraint ('another_tab', 'another_cons');

【讨论】:

  • 谢谢你的及时回答。让我检查一下我是否明白了:我的脚本有很多约束,所以每当我删除一个约束时,我都必须声明异常?另一个疑问,我可以在 postgres 上这样做吗?谢谢!
  • 如果您创建该过程,那么您可以多次调用它而不声明异常。这是给 Oracle 的,我根本不知道 Postgres。
猜你喜欢
  • 2011-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-20
  • 1970-01-01
  • 2020-10-20
  • 2011-11-29
相关资源
最近更新 更多