Mysql 哪种做法更好';检查主ID是否存在,然后跳过';或';插入忽略';?

Mysql 哪种做法更好';检查主ID是否存在,然后跳过';或';插入忽略';?,mysql,sql,Mysql,Sql,如果我正在编写一个系统,它每n分钟检查一个API以获取新消息,那么哪种做法更好?(每条消息都有一个唯一的ID,用作我的系统中的主ID。) 您愿意: 在数据库中查找消息的主ID,如果消息已经存在,则跳过插入消息 是否“插入忽略” 你的两个解决方案都不是。继续读 让数据库来完成这项工作。如果不希望重复,请在列上创建唯一索引。我的猜测是: create unique index unq_messages_messageid on messages (mesageid); (如果您确实需要,这也适用于

如果我正在编写一个系统,它每n分钟检查一个API以获取新消息,那么哪种做法更好?(每条消息都有一个唯一的ID,用作我的系统中的主ID。)

您愿意:

  • 在数据库中查找消息的主ID,如果消息已经存在,则跳过插入消息
  • 是否“插入忽略”

  • 你的两个解决方案都不是。继续读

    让数据库来完成这项工作。如果不希望重复,请在列上创建唯一索引。我的猜测是:

    create unique index unq_messages_messageid on messages (mesageid);
    
    (如果您确实需要,这也适用于字符串或多列。)

    一旦你有了唯一的索引或约束,下面是我建议的两种方法

    (1) 只需插入。如果有重复的,它将失败。处理应用程序代码中的错误。好的应用程序代码可以处理错误


    (2) 在重复密钥更新时使用
    (有一天可能会被冲突忽略时使用
    ):

    这个作业是不可操作的——它什么也不做


    为什么这比插入忽略更可取?原因很简单:它只处理重复密钥的特定错误。其他可能发生的错误仍会返回到应用程序。

    能否向我们展示表格创建代码?我认为答案可能取决于系统是否已经存在。我个人会避免insert ignore,因为它会无声地丢弃它,这看起来像是一个糟糕的过程。“每n分钟检查一个API是否有新消息”-您是否像在队列中一样处理这些消息,并且处理可能有副作用?每n分钟检查一个API是否有新消息的系统我理解为“检索有关上次检查后在数据库中发生的消息(ID未知)的信息“-但稍后您将介绍插入。。。不清楚。查找的想法不起作用。如果用户B在用户A“查找”时插入怎么办?不知道为什么你要告诉我我需要唯一的ID。除非我已经有唯一的ID,否则我的
    insert ignore
    将如何工作?“只需进行插入。如果有重复的,它将失败。”这正是
    insert ignore
    所做的,但不会产生错误消息。如果我已经收到该消息,则不会出现错误,也不会处理任何问题。
    重复密钥更新在本用例中不需要。消息未更新。@AmbroseChapel<代码>插入忽略
    忽略所有错误,而不仅仅是重复的键错误。如果您想要唯一的东西,那么数据库应该强制执行唯一性,而不是应用程序(如果您真的关心的话)<重复键上的代码>忽略您关心的一个错误,而不是所有可能的错误。
    insert into messages ( . . . )
        values ( . . .)
        on duplicate key update message_id = values(message_id);