Предотвращение дублирования вставок в SQL с PHP - PullRequest
0 голосов
/ 10 ноября 2008

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

Ответы [ 6 ]

9 голосов
/ 10 ноября 2008

Возможно, вы захотите создать ограничение «УНИКАЛЬНОЕ» для поля «Домен» - это ограничение вызовет ошибку, если вы создадите две строки с одним и тем же доменом в базе данных. Для объяснения см. это руководство в школе W3C -

http://www.w3schools.com/sql/sql_unique.asp

Если это не решит вашу проблему, уточните базу данных, которую вы выбрали для использования (MySql?).

ПРИМЕЧАНИЕ: Это ограничение полностью отделено от вашего выбора PHP в качестве языка программирования, это определение базы данных SQL. Огромным преимуществом выражения этого ограничения в SQL является то, что вы можете доверять базе данных, чтобы сохранить ограничение, даже когда люди импортируют / экспортируют данные из базы данных, ваше приложение содержит ошибки или другое приложение совместно использует базу данных.

1 голос
/ 10 ноября 2008

Откуда поступают данные? Это то, что вы хотите запустить только один раз, пару раз или часто? Если значение домена уже существует, вы просто хотите пропустить вставку или сделать что-то еще (например, увеличить счетчик)?

В зависимости от ваших ответов, существует множество возможных решений:

  1. Предварительно отсортируйте данные, удалите дубликаты, затем вставьте (предполагает относительно статические данные, пустая таблица для начала)

  2. Использование ассоциативного массива в PHP в качестве локального кэша доменных значений (если таблица уже содержит данные, начните с чтения существующего контента; не потокобезопасен, но работает, если он запускается только один раз за раз)

  3. Сделать домен УНИКАЛЬНЫМ столбцом и написать код оболочки для обработки ошибок возврата

  4. Сделайте домен столбцом UNIQUE или PRIMARY KEY и используйте предложение ON DUPLICATE KEY: INSERT INTO mydata (domain, count) ЗНАЧЕНИЯ ('firstdomain', 1), ('seconddomain', 1), («третий домен», 1) На дубликат ключа ОБНОВЛЕНИЕ счетчик = количество + 1

  5. Вставить все данные в таблицу, затем удалить дубликаты

Обратите внимание, что пакетная вставка (т. Е. Использование нескольких предложений-значений для каждого оператора) может быть значительно быстрее.

1 голос
/ 10 ноября 2008

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

Что касается обнаружения до или после попытки уведомления пользователя, существует ряд методов, которые можно использовать.

0 голосов
/ 10 ноября 2008

Это можно сделать с помощью sql, а не с php.

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

сделать столбец Домен первичным ключом. (имеет смысл, поскольку он должен быть уникальным.)

Вместо использования INSERT используйте UPDATE.

если первичный ключ уже существует (который вы пытаетесь поместить в таблицу), обновление обновит существующий кортеж, а не создаст новый кортеж.

, поэтому вы перезапишете существующие данные, если они отличаются, и если они идентичны, обновление будет пропущено.

0 голосов
/ 10 ноября 2008

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

0 голосов
/ 10 ноября 2008

Я не совсем уверен, что понял ваш вопрос, но, возможно, вы ищете ограничение "UNIQUE" для SQL . Если запрос пытается вставить ранее существующее значение в поле, вы (PHP) будете уведомлены об этом нарушении ограничения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...