PHP MySQLi-在插入或更新之后插入\u id 0-我应该先阅读吗?

PHP MySQLi-在插入或更新之后插入\u id 0-我应该先阅读吗?,php,mysql,mysqli,insert-update,Php,Mysql,Mysqli,Insert Update,我还是个新手,一些正确的编码实践让我不知所措。关于这一特殊情况的文件很薄弱,因此我想从各位专家那里得到一些建议:)关于以下方面 我有一个API,允许用户在一次调用中更新2个表。一个是汇总表,另一个是明细表,其中FK指向汇总表 我让我的代码做的是,我向摘要表执行UPSERT(插入/更新),获取insert\u id,然后从详细信息表中删除记录,然后插入我需要的记录(当然,用fk引用摘要) 但是,在摘要数据没有更改的情况下,insert\u id返回0。这似乎是意料之中的,因为没有更新/插入任何行

我还是个新手,一些正确的编码实践让我不知所措。关于这一特殊情况的文件很薄弱,因此我想从各位专家那里得到一些建议:)关于以下方面

我有一个API,允许用户在一次调用中更新2个表。一个是汇总表,另一个是明细表,其中FK指向汇总表

我让我的代码做的是,我向摘要表执行UPSERT(插入/更新),获取
insert\u id
,然后从详细信息表中删除记录,然后插入我需要的记录(当然,用fk引用摘要)

但是,在摘要数据没有更改的情况下,
insert\u id
返回
0
。这似乎是意料之中的,因为没有更新/插入任何行

所以我的问题是:

在此更新/删除/插入尝试之前,我是否应该对表进行完整读取并比较数据?或者,是否有另一种巧妙的方法来获取摘要的
id
,它是UPSERT尝试的副本?我觉得我的用户在使用这个API时“几乎”总是在更改摘要和详细数据

这里正确的编码实践是什么?每次额外阅读都值得吗?或者,如果插入id=0,我应该只读吗

想法?我最大的问题是,我不知道读和写的大小差异在这里是什么——特别是因为我不相信在不改变值的情况下API会被调用很多

同样,我的选择是:

    • 读取db并进行比较,查看是否存在差异
    • 相应插入/更新
    • 尝试插入/更新
    • 如果(insert_id=0),则读取db以获取详细信息表的摘要id
    • 科姆莱特过程
    • 尝试插入/更新
    • 用什么?获取重复记录(并阻止插入/更新)的摘要id
    • 使用id完成步骤

  • 在我工作过的公司,如果你想逐个记录比较,我通常会使用选项1。这可以在存储过程或代码本身中实现。取决于“相同”的含义。如果是原始值,那么sql可能是最简单的。如果除了数据库所具有的内容之外还有一个上下文,那么您将希望在代码级别执行该操作。希望有帮助

    如果您需要的id是一个自动递增字段,则选项4(使用1个执行操作在DB内执行所有操作)将在100%的时间内执行。这是您需要的一般SQL结构:

    在重复密钥更新中插入摘要(primaryKey,fieldA,fieldB)值(NULL,valueA,valueB)primaryKey=LAST\u Insert\u ID(primaryKey),fieldA=fieldA,fieldB=fieldB

    如果执行
    选择LAST\u INSERT\u ID()
    操作,它将为您提供成功插入的ID,或者如果重复,则提供重复的entrie ID。因此,请执行以下操作:


    delete from detail,其中summary_id=LAST_INSERT_id()

    请重新阅读。说文档很薄弱可能是一个错误。然而,我很挣扎,可能是因为我不知道该找什么。