使用延迟FK更新主键和外键时发出问题

时间:2014-11-28 07:48:26

标签: sql oracle

我正在尝试更新我的主键和外键。经过大量搜索,我发现了延迟密钥的概念。我可以使用PL / SQL中的SQLscript更新我的PK和FK。但是我在使用PHP做同样的事情时遇到错误。下面是我的PHP代码。

$update_p="update project set project_id='$projectname' where project_id='$previousproject'";
            $up=oci_parse($conn,$update_p);


$update_m="update members set project='$projectname' where project='$previousproject'";
$um=oci_parse($conn,$update_m);

$commit="commit";
$c=oci_parse($conn,$commit);

oci_execute($up);

oci_execute($um);

oci_execute($c);
echo"Project Updated!";

2 个答案:

答案 0 :(得分:0)

我不知道你是如何在PL / SQL脚本中做到这一点的,但是将约束声明为可延迟是不够的。

您还应该在交易中将延期约束标记为延期:

enter image description here

  

指定DEFERRED以指示由...指定的条件   提交事务时检查可延迟约束。

因此,您需要在更新表之前将约束设为延迟。

答案 1 :(得分:0)

这是因为您需要明确set the session以及允许延迟约束的密钥。

如果我们假设以下环境:

create table tmp_1 (
    pk number
  , fk number
  , constraint pk_tmp_1 primary key (pk)
    );

create table tmp_2 (
    pk number
  , fk number
  , constraint pk_tmp_2 primary key (pk)
  , constraint fk_tmp_2 foreign key (fk) references tmp_1 (pk)
    );

alter table tmp_1 
  add constraint fk_tmp_1 
      foreign key (fk)
      references tmp_2(pk)
      deferrable;

如果您尝试插入,则会收到以下错误:

SQL> insert into tmp_1 values (1, 2);
insert into tmp_1 values (1, 2)
*
ERROR at line 1:
ORA-02291: integrity constraint (MF.FK_TMP_1) violated - parent key not found


SQL> insert into tmp_2 values (2, 1);
insert into tmp_2 values (2, 1)
*
ERROR at line 1:
ORA-02291: integrity constraint (MF.FK_TMP_2) violated - parent key not found

但是,通过更改会话以将constraints参数设置为deferred,这将起作用:

SQL> alter session set constraints = deferred;

Session altered.

SQL>
SQL> insert into tmp_1 values (1, 2);

1 row created.

SQL> insert into tmp_2 values (2, 1);

1 row created.

此处,deferred "表示在提交事务时检查由延迟约束指定的条件" ,而不是在DML发生时。

虽然有时候循环依赖是必要的,但甲骨文并没有采取行动让你的生活变得轻松 - 它不应该。如果您有循环依赖关系,那么总是值得重新评估您的数据模型以确保这些是必需的。