Как мне отказаться от вставки дубликата записи в MySQL?

0

Мне нужно вставить некоторые данные из внешнего источника.
Моя php-функция запускается периодически, извлекает результаты и вставляет их в таблицу.

Часто есть результаты, которые уже сохранены.
Поэтому они снова вставлены.

Как я отбрасываю те результаты, которые дублируются, так что вводятся только новые результаты, а дубликаты отбрасываются.

  • 1
    INSERT ... ON DUPLICATE KEY UPDATE... - dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html
  • 0
    INSERT IGNORE будет вставлен, только если нет нарушения уникального ключа, иначе ничего не делать. ON DUPLICATE обновит еще. REPLACE удалит / вставит еще.
Показать ещё 1 комментарий
Теги:

5 ответов

1
Лучший ответ

Если вы можете изменить структуру таблиц базы данных, лучшим способом будет добавление UNIQUE INDEX для столбца или нескольких столбцов, которые вместе однозначно идентифицируют одну запись. Например:

ALTER TABLE table ДОБАВИТЬ УНИКАЛЬНЫЙ ИНДЕКС name (column_one, column_two);

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

ALTER IGNORE TABLE table ДОБАВИТЬ УНИКАЛЬНЫЙ ИНДЕКС name (column_one, column_two);

Имейте в виду, что создание ненужных больших индексов приведет к:

  • занято больше дискового пространства
  • медленные записи запросов (INSERT, UPDATE, DELETE)

http://dev.mysql.com/doc/refman/5.1/en/create-index.html (страница описывает другой способ создания индексов, а также ссылки ALTER TABLE)

  • 0
    Очень приятно для первого ответа - с форматированием и все!
0

Я знаю, что это звучит глупо, но определите, как вы можете обнаружить дубликаты и не вставлять их.

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

0

Все реляционные базы данных допускают как первичные ключи, так и уникальные ограничения в одной строке.

Итак, если у вас есть таблица PERSON с столбцом person_id и уникальными комбинациями столбцов first_name и last_name, вы должны сделать person_id основной ключ и добавить уникальное ограничение на (first_name, last_name). Вы не сможете вставить строку, которая нарушает уникальное ограничение, даже если первичные ключи уникальны.

0

Что касается первичных ключей, если вы правильно определяете свои первичные ключи, вам не придется иметь дело с дубликатами, потому что у вас их не будет.

0

Команда INSERT IGNORE ... выполняет именно это, если у вас есть первичный ключ, установленный в вашей таблице.

Если у вас еще нет первичного ключа, укажите его имя или идентификатор вашей записи, где одинаковое имя/идентификатор будет указывать на повторяющиеся данные.

  • 0
    Достаточно уникального ключа, первичный ключ - это особый случай уникального ключа :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню