2010-04-02 3 views
3

здесь является таблица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 еще не существует

любая идея?

благодарит

ответ

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 с текущей датой.

EDIT: Как было предложено ~unutbu, если вы не хотите ничего менять в двух экземплярах, вы можете использовать синтаксис INSERT IGNORE. Это просто работает следующим образом:

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

Это просто превращает некоторые виды ошибок в предупреждение, полезнее всего, ошибка, которая утверждает, что будет дубликат уникальной учетной записью. Если вы поместите ключевое слово IGNORE в свой оператор, вы не получите ошибку - запрос будет просто удален. В сложных запросах это может также скрыть другие ошибки, которые могут быть полезны, поэтому, чтобы лучше было убедиться, что ваш код верен, если вы хотите его использовать.

+0

Есть ли какой-либо другой способ, а затем ОБНОВЛЕНИЕ DUPLICATE? например, проверка наличия url = http: //example.com? –

+0

, например query2 = "" "SELECT * FROM kompas_url WHERE url ==% s" "" –

+2

Существует также 'INSERT IGNORE', который просто игнорирует инструкцию insert, если вставка приведет к дублированию уникального ключа. – unutbu

Смежные вопросы