Мне нужно вставить некоторые данные из внешнего источника.
Моя php-функция запускается периодически, извлекает результаты и вставляет их в таблицу.
Часто есть результаты, которые уже сохранены.
Поэтому они снова вставлены.
Как я отбрасываю те результаты, которые дублируются, так что вводятся только новые результаты, а дубликаты отбрасываются.
Если вы можете изменить структуру таблиц базы данных, лучшим способом будет добавление UNIQUE INDEX для столбца или нескольких столбцов, которые вместе однозначно идентифицируют одну запись. Например:
ALTER TABLE table
ДОБАВИТЬ УНИКАЛЬНЫЙ ИНДЕКС name
(column_one
, column_two
);
Если таблица уже содержит повторяющиеся записи, попытка изменения приведет к ошибке. В этом случае вы можете использовать IGNORE:
ALTER IGNORE TABLE table
ДОБАВИТЬ УНИКАЛЬНЫЙ ИНДЕКС name
(column_one
, column_two
);
Имейте в виду, что создание ненужных больших индексов приведет к:
http://dev.mysql.com/doc/refman/5.1/en/create-index.html (страница описывает другой способ создания индексов, а также ссылки ALTER TABLE)
Я знаю, что это звучит глупо, но определите, как вы можете обнаружить дубликаты и не вставлять их.
Это зависит от вашего набора данных. Если у вас есть уникальное поле, самым простым способом было бы установить уникальный индекс в этом поле в базе данных, первичный ключ, и база данных не позволит вставить дубликат. Просто проверьте свои ошибки, и если вы получите двойную ключевую ошибку, не обращайте внимания на то, что вы ожидаете.
Все реляционные базы данных допускают как первичные ключи, так и уникальные ограничения в одной строке.
Итак, если у вас есть таблица PERSON
с столбцом person_id
и уникальными комбинациями столбцов first_name
и last_name
, вы должны сделать person_id
основной ключ и добавить уникальное ограничение на (first_name, last_name)
. Вы не сможете вставить строку, которая нарушает уникальное ограничение, даже если первичные ключи уникальны.
Что касается первичных ключей, если вы правильно определяете свои первичные ключи, вам не придется иметь дело с дубликатами, потому что у вас их не будет.
Команда INSERT IGNORE ...
выполняет именно это, если у вас есть первичный ключ, установленный в вашей таблице.
Если у вас еще нет первичного ключа, укажите его имя или идентификатор вашей записи, где одинаковое имя/идентификатор будет указывать на повторяющиеся данные.
INSERT ... ON DUPLICATE KEY UPDATE...
- dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.htmlINSERT IGNORE
будет вставлен, только если нет нарушения уникального ключа, иначе ничего не делать.ON DUPLICATE
обновит еще.REPLACE
удалит / вставит еще.