【问题标题】:How to avoid duplicate entries in a MySQL database without throwing an error如何在不引发错误的情况下避免 MySQL 数据库中的重复条目
【发布时间】:2015-03-03 11:01:55
【问题描述】:

我正在使用 Python-MySQL (MySQLdb) 库将值插入数据库。我想避免重复的条目被插入到数据库中,所以我在 MySQL 中的该列中添加了 unique 约束。我正在检查 title 列中的重复项。在我的 Python 脚本中,我使用了以下语句:

cursor.execute ("""INSERT INTO `database` (title, introduction) VALUES (%s, %s)""", (title, pure_introduction))

现在当一个重复的条目被添加到数据库中时,它会产生一个错误。我不希望出现错误消息;我只是希望如果找到重复条目,那么它不应该将该值输入数据库。我该怎么做?

【问题讨论】:

  • 哇!有时微小的变化可以创造奇迹!!!希望我可以将其标记为已接受的答案:)

标签: python mysql mysql-python


【解决方案1】:

您可以利用INSERT IGNORE 语法来抑制此类错误。

如果您使用 IGNORE 关键字,则在执行 INSERT 语句时发生的错误将被忽略。例如,如果没有 IGNORE,复制表中现有 UNIQUE 索引或 PRIMARY KEY 值的行会导致重复键错误并且语句被中止。使用 IGNORE,该行将被丢弃并且不会发生错误。忽略的错误可能会生成警告,尽管重复键错误不会。

在您的情况下,查询将变为:

INSERT IGNORE INTO `database` (title, introduction) VALUES (%s, %s)

【讨论】:

  • 请注意,这可能会忽略可能发生的一整套其他错误。 (文档中的引用确实如此,但值得重复!)
【解决方案2】:

除了@Andy 的建议(确实应该作为答案发布)之外,您还可以在 Python 中捕获异常并将其静音:

try:
    cursor.execute ("""INSERT INTO `database` (title, introduction) VALUES (%s, %s)""", (title, pure_introduction))
except MySQLdb.IntegrityError:
    pass  # or may be at least log?

【讨论】:

  • 作为一个附带问题,我在哪里可以找到光标的文档?我搜了一下,找到了this,但是好像不够用。
  • @sємsєм 例如,here(特别是 MySQLdb)。
  • +one 这肯定是类似听起来问题的好选择!
  • 不幸的是,文档没有显示错误返回什么? @alecxe
  • @sємsєм 至于MySQLdb - 是的,documentation 真的很烂。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-11
  • 2014-06-17
  • 2023-02-20
  • 1970-01-01
  • 2020-05-07
  • 1970-01-01
相关资源
最近更新 更多