PHP MySQLi - 插入或更新后插入_id 0 - 我应该先读取吗?

时间:2014-08-08 04:07:25

标签: php mysql mysqli insert-update

我还是新手,一些正确的编码习惯让我感到震惊。关于这种特殊情况的文档很薄弱,所以我想从你的专家那里得到一些建议/建议:)。

我有一个API,允许用户在一次调用中更新2个表。一个是 SUMMARY 表,另一个是 DETAIL 表,其中有一个FK到 SUMMARY 表。

我的代码所做的是我对 SUMMARY 表执行UPSERT(插入/更新),抓取insert_id然后从 DETAIL <删除记录/ i> table,然后插入我需要的那些(当然用fk引用 SUMMARY )。

但是,在概要数据没有变更的情况下 - insert_id会返回0。这似乎是预期的,因为没有更新/插入行。

所以这是我的问题:

在更新/删除/插入尝试之前,我是否应该对表进行完整读取并比较数据?或者是否有另一种抓取 SUMMARY id的非常好的方法,它是UPSERT尝试的副本?我觉得我的用户几乎可以&#39;使用此API时,请务必更改 SUMMARY DETAIL 数据。

这里的编码实践是什么?额外阅读是否值得每次?或者我应该只在insert_id = 0

时阅读

思考?我最大的问题是我不知道读取与写入的幅度差异在哪里 - 特别是因为我不相信在没有更改值的情况下会调用API。

我的选择再次是:

    • 读取数据库并进行比较以查看是否存在差异
    • 相应地插入/更新
    • 尝试插入/更新。
    • if(insert_id = 0)然后读取db以获取详细信息表
    • 的摘要ID
    • copmlete process
    • 尝试插入/更新
    • 使用什么?获取重复记录摘要的ID(并阻止插入/更新)
    • 使用id完成步骤。

2 个答案:

答案 0 :(得分:1)

如果您需要的id是auto_increment字段,则选项4(在DB中执行1执行操作的所有操作)100%的时间。这是您需要的通用SQL结构:

Insert into summary (primaryKey, fieldA, fieldB) values (NULL, valueA, valueB) on duplicate key update primaryKey=LAST_INSERT_ID(primaryKey), fieldA = fieldA, fieldB=fieldB;

如果您执行SELECT LAST_INSERT_ID(),它将为您提供成功的插入ID,或者,如果重复,则为您提供重复的entrie的ID。所以做一些像:

delete from detail where summary_id = LAST_INSERT_ID();

答案 1 :(得分:0)

在我工作过的公司中,如果您想要按记录比较,那么选项1通常是我曾经使用过的公司。这可以在存储过程中或在代码本身中实现。取决于什么&#34;相同&#34;手段。如果是原始值,那么sql可能是最简单的。如果除了数据库之外还有上下文,您将希望在代码级别执行此操作。希望有所帮助。