Проверка Python MySQL на наличие дубликатов перед вставкой

Вот таблица

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)
)

Я пытаюсь сделать INSERT для таблицы kompas_url, только если URL еще не существует

любая идея?

Спасибо

1 ответ

Вы можете узнать, находится ли он там первым, 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 в своем утверждении вы не получите ошибку - запрос просто будет отброшен. В сложных запросах это также может скрывать другие ошибки, которые могут быть полезны, поэтому лучше убедиться, что ваш код правильный, если вы хотите его использовать.

Другие вопросы по тегам