Проверка Python MySQL на наличие дубликатов перед вставкой - PullRequest
3 голосов
/ 02 апреля 2010

вот таблица

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 Ответ

9 голосов
/ 02 апреля 2010

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

...