Python MySQL 插入前检查重复项

3 投票
1 回答
9022 浏览
提问于 2025-04-15 21:08

这是一个表格

CREATE TABLE IF NOT EXISTS kompas_url
(
    id  BIGINT(20) NOT NULL AUTO_INCREMENT,
    url VARCHAR(1000),
    created_date datetime,
    modified_date datetime,
    PRIMARY KEY(id)
)

我想往 kompas_url 这个表里插入数据,但前提是这个网址还不存在

有没有什么好主意?

谢谢

1 个回答

9

你可以先通过 SELECT 语句根据 url 来检查数据是否已经存在,或者你可以让 url 字段变得唯一:

CREATE TABLE IF NOT EXISTS kompas_url
    ...
    url VARCHAR(1000) UNIQUE,
    ...
)

这样做可以防止 MySQL 插入重复的行,但如果你尝试插入时会报错。这就不好了——虽然我们可以处理这个错误,但它可能会掩盖其他错误。为了解决这个问题,我们使用 ON DUPLICATE KEY UPDATE 语法:

INSERT INTO kompas_url (url, created_date, modified_date)
VALUES ('http://example.com', NOW(), NOW())
ON DUPLICATE KEY UPDATE modified_date = NOW()

这让我们可以在遇到唯一字段(包括主键)重复值的情况下提供一个 UPDATE 语句。在这种情况下,我们可能想要用当前日期更新 modified_date 字段。

编辑:正如 ~unutbu 所建议的,如果你不想在重复时做任何更改,可以使用 INSERT IGNORE 语法。这种方式的工作原理如下:

INSERT IGNORE INTO kompas_url (url, created_date, modified_date)
VALUES ('http://example.com', NOW(), NOW())

这会把某些类型的错误变成警告——最有用的是,关于将会有重复唯一条目的错误。如果你在语句中加入 IGNORE 这个关键词,你就不会收到错误提示——查询会被简单地忽略掉。不过在复杂的查询中,这也可能会隐藏其他有用的错误,所以如果你想使用这个方法,最好确保你的代码是正确的。

撰写回答