php oci:插入所需的未提交外键
php oci: uncommitted foreign key needed for insert
所以我的情况是:
我有 2 个表:
- TABLE_A
- TABLE_B
- TABLE_A 有一个 ID 作为主键作为身份
- TABLE_B 有一个 ID 作为标识,a_ID 作为外键引用来自 TABLE_A
的 ID
我将 oci_execute 与 OCI_NO_AUTO_COMMIT 一起使用,因此如果稍后插入失败,则根本不会发生插入。如果每个 运行 都成功,我会在最后提交;
问题
我 运行 在 TABLE_A 上插入 returns 我想在之后立即使用的插入行 ID。
但由于尚未提交,我收到外键违规错误。
可能的解决方案
- 我想做一个预写的 PL/SQL 脚本,但我可能 运行 多次插入,所以我最终会替换字符串并连接多个插入字符串,而不是正确绑定变量。
- 我什至想过无论如何都要插入行并在出现问题时删除行,但这听起来很糟糕,我宁愿进行字符串查询操作。
- 也许 TABLE_A 应该有一个没有用的 0 ID,我首先使用它。后来我把它改成了插入的,但这听起来也很糟糕。
还有其他方法吗?
我不知道 PHP,但是 - 看看我的 Oracle 观点是否有帮助。
这是你现在拥有的:
SQL> create table table_a (id number primary key);
Table created.
SQL> create table table_b (id number primary key,
2 id_fk number references table_a
3 );
Table created.
SQL> insert into table_b values (1, 1);
insert into table_b values (1, 1)
*
ERROR at line 1:
ORA-02291: integrity constraint (SCOTT.SYS_C00105535) violated - parent key not
found
当然不行...table_a
中没有父键。
但是,如果您更改外键约束,使其“忽略”所引用的键是否存在并在 COMMIT
点进行检查,则此 可能 成为您要找的人。
参见第 3 行和第 4 行:
SQL> drop table table_b;
Table dropped.
SQL> create table table_b (id number primary key,
2 id_fk number constraint fk_ba references table_a
3 initially deferred deferrable
4 );
Table created.
SQL> insert into table_b values (1, 1);
1 row created.
看到了吗?插入成功,尽管 table_a
中引用的主键尚不存在。
所以,一旦你输入它......
SQL> insert into table_a values (1);
1 row created.
...并提交...
SQL> commit;
Commit complete.
SQL>
...一切都在这里:
SQL> select * From table_a;
ID
----------
1
SQL> select * from table_b;
ID ID_FK
---------- ----------
1 1
SQL>
如果问题与PHP有关,恐怕我帮不上忙了。
所以我的情况是:
我有 2 个表:
- TABLE_A
- TABLE_B
- TABLE_A 有一个 ID 作为主键作为身份
- TABLE_B 有一个 ID 作为标识,a_ID 作为外键引用来自 TABLE_A 的 ID
我将 oci_execute 与 OCI_NO_AUTO_COMMIT 一起使用,因此如果稍后插入失败,则根本不会发生插入。如果每个 运行 都成功,我会在最后提交;
问题
我 运行 在 TABLE_A 上插入 returns 我想在之后立即使用的插入行 ID。 但由于尚未提交,我收到外键违规错误。
可能的解决方案
- 我想做一个预写的 PL/SQL 脚本,但我可能 运行 多次插入,所以我最终会替换字符串并连接多个插入字符串,而不是正确绑定变量。
- 我什至想过无论如何都要插入行并在出现问题时删除行,但这听起来很糟糕,我宁愿进行字符串查询操作。
- 也许 TABLE_A 应该有一个没有用的 0 ID,我首先使用它。后来我把它改成了插入的,但这听起来也很糟糕。
还有其他方法吗?
我不知道 PHP,但是 - 看看我的 Oracle 观点是否有帮助。
这是你现在拥有的:
SQL> create table table_a (id number primary key);
Table created.
SQL> create table table_b (id number primary key,
2 id_fk number references table_a
3 );
Table created.
SQL> insert into table_b values (1, 1);
insert into table_b values (1, 1)
*
ERROR at line 1:
ORA-02291: integrity constraint (SCOTT.SYS_C00105535) violated - parent key not
found
当然不行...table_a
中没有父键。
但是,如果您更改外键约束,使其“忽略”所引用的键是否存在并在 COMMIT
点进行检查,则此 可能 成为您要找的人。
参见第 3 行和第 4 行:
SQL> drop table table_b;
Table dropped.
SQL> create table table_b (id number primary key,
2 id_fk number constraint fk_ba references table_a
3 initially deferred deferrable
4 );
Table created.
SQL> insert into table_b values (1, 1);
1 row created.
看到了吗?插入成功,尽管 table_a
中引用的主键尚不存在。
所以,一旦你输入它......
SQL> insert into table_a values (1);
1 row created.
...并提交...
SQL> commit;
Commit complete.
SQL>
...一切都在这里:
SQL> select * From table_a;
ID
----------
1
SQL> select * from table_b;
ID ID_FK
---------- ----------
1 1
SQL>
如果问题与PHP有关,恐怕我帮不上忙了。