【问题标题】:php oci: uncommitted foreign key needed for insertphp oci:插入需要未提交的外键
【发布时间】:2021-07-08 18:31:34
【问题描述】:

所以我的情况是:

我有 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 foreign-keys constraints


    【解决方案1】:

    我不懂 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有关的,那我怕是帮不上忙了。

    【讨论】:

    • 哇哦!我的老师没有提到约束,这是一个非常简单的解决方案。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2016-12-23
    • 1970-01-01
    • 2014-04-13
    • 2015-07-04
    • 1970-01-01
    • 2015-11-27
    • 2018-05-04
    • 2016-12-17
    相关资源
    最近更新 更多