Подтвердить что ты не робот

Заменить синтаксис запроса

Я хочу иметь возможность обновлять таблицу той же схемы, используя оператор "replace into". В конце концов, мне нужно иметь возможность обновлять большую таблицу со значениями, которые могут быть изменены.

Вот что я использую для начала:

REPLACE INTO table_name
(visual, inspection_status, inspector_name, gelpak_name, gelpak_location),
VALUES (3, 'Partially Inspected', 'Me', 'GP1234', 'A01');

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

Я просто пытаюсь найти эффективный способ сделать это, чтобы я мог обновить > 45 000 строк за минуту.

4b9b3361

Ответ 1

Как сообщает документация:

REPLACE работает точно так же, как INSERT, за исключением того, что если старая строка в таблице имеет то же значение, что и новая строка для PRIMARY KEY или UNIQUE, старая строка будет удалена до того, как будет вставлена ​​новая строка.

Ответ 2

REPLACE работает очень похоже на INSERT, который просто перезаписывает записи, имеющие одинаковый индекс PRIMARY KEY или UNIQUE, однако, будьте осторожны.

Шломи Ноах пишет о проблеме с использованием REPLACE INTO здесь:

Но люди со слабым сердцем, как и я, должны помнить следующее: это решение для тяжеловесов. Это может быть именно то, что вы искали с точки зрения простоты использования, но дело в том, что на дублирующих ключах выполняются DELETE и INSERT, и это требует более тщательного изучения.

Всякий раз, когда строка удаляется, все индексы должны быть обновлены, и, самое главное, ПЕРВИЧНЫЙ КЛЮЧ. Когда вставляется новая строка, происходит то же самое. Особенно это касается таблиц InnoDB (из-за их кластерной природы), это означает большие накладные расходы. Реструктуризация индекса является дорогостоящей операцией. Узлы индекса, возможно, должны быть объединены после УДАЛЕНИЯ. Узлы, возможно, должны быть разделены из-за INSERT. После многих выполнений REPLACE INTO наиболее вероятно, что ваш индекс будет более фрагментированным, чем он был бы, если бы вы использовали SELECT/UPDATE или INSERT INTO... ON DUPLICATE KEY

Кроме того, существует понятие "хорошо, если строки нет, мы создаем ее. Если она там, она просто обновляется". Это неверно Строка не просто обновляется, она полностью удаляется. Проблема заключается в том, что если в этой таблице есть PRIMARY KEY и REPLACE INTO не указывает значение для PRIMARY KEY (например, это столбец AUTO_INCREMENT), новая строка получает другое значение, и это может быть не то, что вы искали с точки зрения поведения.

Многие виды использования REPLACE INTO не предназначены для изменения значений PRIMARY KEY (или других UNIQUE KEY). В таком случае его лучше оставить в покое. В производственной системе, которую я видел, изменение REPLACE INTO на INSERT INTO... ON DPLICATE KEY привело к увеличению пропускной способности в десять раз (измеряется в запросах в секунду) и резкому снижению операций ввода-вывода и средней загрузки.

Таким образом, REPLACE INTO может быть правильным для вашей реализации, но вы можете найти более подходящим (и менее рискованным) вместо этого использовать INSERT ... ON DUPLICATE KEY UPDATE.

Ответ 3

или что-то в этом роде:

insert ignore tbl1 (select * from tbl2);

UPDATE
        'tbl1' AS 'dest',
        (SELECT * FROM tbl2) AS 'src'
    SET
       dest.field=src.field,
       dest.field=if (length(src.field)>0,src.field,dest.field) /* or anything like that*/
    WHERE
        'dest'.id = 'src'.id;