ЗАМЕНИТЬ В INTO, повторно ли он использует ПЕРВЫЙ КЛЮЧ?

Функция REPLACE INTO в MySQL работает таким образом, что она удаляет и вставляет строку. В моей таблице первичный ключ (id) автоматически увеличивается, поэтому я ожидал его удаления, а затем вставьте таблицу с id в хвост базы данных.

Однако он делает неожиданное и вставляет его с тем же id! Является ли это ожидаемым поведением, или я здесь что-то не хватает? (Я не устанавливаю id при вызове оператора REPLACE INTO)

Ответы

Ответ 1

Это ожидаемое поведение, если в вашей таблице есть другой индекс UNIQUE, который должен быть в противном случае, он добавит строку, как и следовало ожидать. См. Документацию:

REPLACE работает точно так же, как INSERT, за исключением того, что если старая строка в таблице имеет то же значение, что и новая строка для PRIMARY KEY или UNIQUE index, старая строка удаляется перед вставкой новой строки. См. Раздел 13.2.5, "Синтаксис INSERT".

https://dev.mysql.com/doc/refman/5.5/en/replace.html

Это действительно имеет смысл, потому что как еще mySQL найдет строку для замены? Он мог сканировать всю таблицу, и это потребует много времени. Я создал SQL Fiddle, чтобы продемонстрировать это, пожалуйста, посмотрите здесь

Ответ 2

Это ожидаемое поведение. Технически, в тех случаях, когда ВСЕ уникальные ключи (а не только первичный ключ) на заменяемых/вставленных данных соответствуют существующей строке, MySQL фактически удаляет существующую строку и вставляет новую строку с заменяющими данными, используя те же значения для всех уникальных ключей. Итак, если вы посмотрите на количество затронутых строк в таком запросе, вы получите 2 затронутых строки для каждой замены и только одну для прямых вставок.