我还是新手,一些正确的编码习惯让我感到震惊。关于这种特殊情况的文档很薄弱,所以我想从你的专家那里得到一些建议/建议:)。
我有一个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。
我的选择再次是:
答案 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可能是最简单的。如果除了数据库之外还有上下文,您将希望在代码级别执行此操作。希望有所帮助。