微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php oci:插入 问题可能的解决方案还有其他方法可以做到这一点吗?

如何解决php oci:插入 问题可能的解决方案还有其他方法可以做到这一点吗?

所以我的情况是:

我有 2 张桌子:

  • TABLE_A
  • TABLE_B

  • TABLE_A 有一个 ID 作为主键作为身份
  • TABLE_B 有一个 ID 作为身份,a_ID 作为外键引用来自 TABLE_A 的 ID

我将 oci_execute 与 OCI_NO_AUTO_COMMIT 一起使用,因此如果稍后插入失败,则插入根本不会发生。如果一切都成功运行,我会在最后提交;

问题

我在 TABLE_A 上运行了一个插入操作,它返回我想在之后立即使用的插入行 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有关,那我恐怕帮不上忙了。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。