Не работает IGNORE при вставке нескольких строк в MYSQL(Python)

пытаюсь сделать так, чтобы значения вставлялись только тогда когда их нет в базе. Нашёл решение с IGNORE, но даже при наличии такой же строки все равно запись добавляется. Что я делаю не так?

new_event = """INSERT IGNORE INTO message_parser 
                                  (message, server_time, modem_time, TA_name)
                                  VALUES (%s,%s,%s,%s)"""
                exec_str = execute_query2(connection, new_event, val)

val - является списком(list) с кортежами(tuple)

P.S. Пробовал также менять на REPLACE и ON DUPLICATE KEY UPDATE но они тоже не пропускали значения, которые уже есть. Есть предположения, что это из-за добавления сразу нескольких строк, но я не уверен в этом, тем более это очень замедлит работу.


Ответы (1 шт):

Автор решения: Akina

сделать так, чтобы значения вставлялись только тогда когда их нет в базе. Нашёл решение с IGNORE, но даже при наличии такой же строки все равно запись добавляется.

IGNORE при использовании в INSERT делает одну-единственную вещь - если при выполнении запроса возникает нефатальная ошибка (нарушение внешнего ключа, уникальности, ограничения), то ошибка преобразуется в предупреждение, вследствие чего запрос не обрывается, а выполняется дальше, а записи, вызвавшие ошибку указанного типа, в таблицу не вставляются. ВСЁ.

Если даже при наличии такой же строки все равно запись добавляется - значит, ошибки дублирования не возникает. Что в свою очередь говорит о том, что Вы просто не озаботились созданием уникального индекса либо ограничения (constraint). Т.е. в структуре таблицы нет ничего, что бы препятствовало наличию в ней таких дубликатов.

Определите выражение, которое обязано быть уникальным (например, комбинация 4 указанных полей), и создайте по нему уникальный индекс. Без такого индекса сервер никогда не догадается, что Вы считаете дубликатом.

→ Ссылка