Не работает 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 шт):
сделать так, чтобы значения вставлялись только тогда когда их нет в базе. Нашёл решение с IGNORE, но даже при наличии такой же строки все равно запись добавляется.
IGNORE при использовании в INSERT делает одну-единственную вещь - если при выполнении запроса возникает нефатальная ошибка (нарушение внешнего ключа, уникальности, ограничения), то ошибка преобразуется в предупреждение, вследствие чего запрос не обрывается, а выполняется дальше, а записи, вызвавшие ошибку указанного типа, в таблицу не вставляются. ВСЁ.
Если даже при наличии такой же строки все равно запись добавляется - значит, ошибки дублирования не возникает. Что в свою очередь говорит о том, что Вы просто не озаботились созданием уникального индекса либо ограничения (constraint). Т.е. в структуре таблицы нет ничего, что бы препятствовало наличию в ней таких дубликатов.
Определите выражение, которое обязано быть уникальным (например, комбинация 4 указанных полей), и создайте по нему уникальный индекс. Без такого индекса сервер никогда не догадается, что Вы считаете дубликатом.