Предотвращение дублирования строк на основе столбца (MySQL)?

#mysql #duplicates #duplicate-removal

#mysql #дубликаты

Вопрос:

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

Однако один недостаток заключается в том, что выполнение сценариев занимает много времени. Когда они запускаются в первый раз, процесс выполняется быстро, но после этого требуется почти 20 минут, чтобы просмотреть список из более чем 200 тысяч элементов, полученных от стороннего API.

Проблема в том, что скрипт сначала получает все строки из базы данных и добавляет их обязательное уникальное значение столбца в список. Затем, при просмотре результатов API, проверяется, существует ли в списке значение, которое должно быть уникальным для текущих элементов. Это становится действительно тяжелым, поскольку в списке содержится более 200 тыс. значений.

Есть ли способ проверить в INSERT -запросе, что на основе одного столбца дубликатов нет? Если есть, просто не добавляйте новую строку.

Любая помощь будет оценена =)

Ответ №1:

Если вы добавите UNIQUE ключ к столбцу (столбцам), которые должны содержать УНИКАЛЬНЫЕ значения, MySQL будет жаловаться, когда вы вставите строку, которая нарушает это ограничение.

Тогда у вас есть три варианта:

  • INSERT IGNORE попытается вставить, и в случае нарушения ничего не делать.
  • INSERT ... ON DUPLICATE KEY UPDATE попытается вставить, и в случае нарушения обновит строку до новых значений
  • REPLACE попытается вставить, а в случае нарушения УДАЛИТЬ существующую строку, нарушающую правила, и ВСТАВИТЬ новую.

Комментарии:

1. Однако есть одна проблема. В некоторых случаях требуется, чтобы общий уникальный столбец дублировался, в то время как другой столбец не может быть. Есть ли способ задать уникальный столбец для конкретного запроса?

2. Чем сложнее ваши деловые правила, тем менее вероятно, что доступно готовое решение. Возможно, есть другие способы их моделирования, чтобы они поддерживались встроенными механизмами. Пример: Если у вас есть одна таблица с УНИКАЛЬНЫМ ключом, куда попадают действительно уникальные случаи, и другая клонированная таблица без УНИКАЛЬНОГО ключа для других случаев, представление, которое выполняет ОБЪЕДИНЕНИЕ таблиц, может работать для того, что вы хотите. Однако это зависит от ваших бизнес-правил…