Php &引用;替换为“;插入[如果]

Php &引用;替换为“;插入[如果],php,mysql,insert,replace,Php,Mysql,Insert,Replace,好吧,我有个问题,不是什么问题 我的数据库中有一个表,相当小,只有3列,但有增长的潜力。对于我的问题,我有两种解决方案,但不确定为什么要使用其中一种 我有一段数据,可能在数据库中,也可能不在数据库中。有两种方法可以解决这个问题。我有唯一的ID,所以很容易检查 检查数据库中是否存在记录,如果不存在,则将插入到数据库中 使用替换为,因为我已经有了ID 我现在的问题是。哪一个更好用。使用这两种结果的优缺点是什么。还是有更好的结果 请注意,数据是完全相同的,因此不可能使用新的值更新记录。因此,REPLA

好吧,我有个问题,不是什么问题

我的数据库中有一个表,相当小,只有3列,但有增长的潜力。对于我的问题,我有两种解决方案,但不确定为什么要使用其中一种

我有一段数据,可能在数据库中,也可能不在数据库中。有两种方法可以解决这个问题。我有唯一的ID,所以很容易检查

  • 检查数据库中是否存在记录,如果不存在,则将
    插入到数据库中
  • 使用
    替换为
    ,因为我已经有了ID
  • 我现在的问题是。哪一个更好用。使用这两种结果的优缺点是什么。还是有更好的结果


    请注意,数据是完全相同的,因此不可能使用新的值更新记录。因此,
    REPLACE-INTO
    将插入已经存在的数据。

    REPLACE-INTO
    在这里不推荐使用-您实际上不需要替换任何内容。它确实会删除
    ,然后插入
    ,并产生所有后果。例如,所有索引都必须更新,如果您经常使用,则会导致不必要的工作和索引碎片

    另一方面,DUPLICATE KEY UPDATE上有
    ,它主要用于计数器,但您没有使用增量或任何其他值更改来更新行,因此您必须使用奇怪的语法,如
    SET id=id
    或类似的语法

    检查数据库中是否存在该记录对您来说是最好的解决方案,但不要使用另一个查询,而是让mysql为您执行该检查并使用:

    `INSERT IGNORE INTO ...`
    

    这样,如果您尝试插入具有重复的唯一键或主键的任何行,则不会插入该行而不产生任何错误。请注意可能丢失其他错误消息的副作用,但如果您确切知道插入的内容,则应该没有问题。

    请注意,
    REPLACE INTO
    在内部实现为
    DELETE
    ,然后是
    insert
    。delete是正常的delete,这意味着它将检查外键并遵守delete上的
    子句。您可能希望
    插入到。。。在重复密钥更新时…
    。但是,这里的最佳实践是什么?另外,如果您尝试使用相同(现有)值更新一行,MySQL将检测到这些值相同,并将跳过更新、节省时间、锁定等——这是使用
    插入到…重复密钥更新时…
    而不是先删除现有行的另一个原因。可能重复