我正在尝试更新我的主键和外键。经过大量搜索,我发现了延迟密钥的概念。我可以使用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!";
答案 0 :(得分:0)
我不知道你是如何在PL / SQL脚本中做到这一点的,但是将约束声明为可延迟是不够的。
您还应该在交易中将延期约束标记为延期:
指定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发生时。
虽然有时候循环依赖是必要的,但甲骨文并没有采取行动让你的生活变得轻松 - 它不应该。如果您有循环依赖关系,那么总是值得重新评估您的数据模型以确保这些是必需的。