Spec-Zone .ru
спецификации, руководства, описания, API

13.2.8. REPLACE Синтаксис

REPLACE [LOW_PRIORITY | DELAYED]    [INTO] tbl_name    [PARTITION (partition_name,...)]     [(col_name,...)]    {VALUES | VALUE} ({expr | DEFAULT},...),(...),...

Или:

REPLACE [LOW_PRIORITY | DELAYED]    [INTO] tbl_name    [PARTITION (partition_name,...)]     SET col_name={expr | DEFAULT}, ...

Или:

REPLACE [LOW_PRIORITY | DELAYED]    [INTO] tbl_name    [PARTITION (partition_name,...)]      [(col_name,...)]    SELECT ...

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

REPLACE расширение MySQL стандарта SQL. Это или вставляет, или удаляет и вставляет. Для другого расширения MySQL стандартного SQL — что или вставляет или обновления — видят Раздел 13.2.5.3,"INSERT ... ON DUPLICATE KEY UPDATE Синтаксис".

DELAYED вставляет и замены осуждались в MySQL 5.6.6. В MySQL 5.7, DELAYED не поддерживается. Сервер распознает, но игнорирует DELAYED ключевое слово, обрабатывает замену как незадержанную замену, и генерирует ER_WARN_LEGACY_SYNTAX_CONVERTED предупреждение. ("ЗАДЕРЖАННАЯ ЗАМЕНА больше не поддерживается. Оператор был преобразован в ЗАМЕНУ.") DELAYED ключевое слово будет удалено в будущем выпуске.

Отметьте это, если у таблицы нет a PRIMARY KEY или UNIQUE индексируйте, используя a REPLACE оператор не имеет никакого смысла. Это становится эквивалентным INSERT, потому что есть, не индексируют, чтобы использоваться, чтобы определить, копирует ли новая строка другого.

Значения для всех столбцов принимаются от значений, определенных в REPLACE оператор. Любые недостающие столбцы устанавливаются в их значения по умолчанию, как это происходит для INSERT. Невозможно обратиться к значениям от текущей строки и использовать их в новой строке. Если Вы используете присвоение такой как SET col_name = col_name + 1, ссылка на имя столбца на правой стороне обрабатывается как DEFAULT(col_name), таким образом, присвоение эквивалентно SET col_name = DEFAULT(col_name) + 1.

Использовать REPLACE, у Вас должны быть оба INSERT и DELETE полномочия для таблицы.

REPLACE поддерживает явный выбор раздела, используя PARTITION ключевое слово со списком разделенных запятой значений имен разделов, подразделов, или обоих. Как с INSERT, если не возможно вставить новую строку в какой-либо из этих разделов или подразделов, REPLACE оператор перестал работать с ошибкой, Найденной строкой, не соответствующей данный установленный раздел. См. Раздел 17.5, "Выбор Раздела", для получения дополнительной информации.

REPLACE оператор возвращает количество, чтобы указать на число строк, на которые влияют. Это - сумма строк, удаленных и вставленных. Если количество 1 для единственной строки REPLACE, строка была вставлена, и никакие строки не были удалены. Если количество больше чем 1, один, или более старые строки были удалены прежде, чем новая строка была вставлена. Для единственной строки возможно заменить больше чем одну старую строку, если таблица содержит многократные уникальные индексы и новые значения копий строки для различных старых строк в различных уникальных индексах.

Количество влиявших строк облегчает определять ли REPLACE только добавленный строка или заменяло ли это также какие-либо строки: Проверьте, является ли количество 1 (добавленным) или больше (замененный).

Если Вы используете API C, количество влиявших строк может быть получено, используя mysql_affected_rows() функция.

В настоящий момент невозможно заменить в таблицу и выбрать из той же самой таблицы в подзапросе.

MySQL использует следующий алгоритм для REPLACELOAD DATA ... REPLACE):

  1. Попытайтесь вставить новую строку в таблицу

  2. В то время как вставка перестала работать, потому что двойная ключевая ошибка происходит для первичного ключа или уникального индекса:

    1. Удалите из таблицы конфликтную строку, у которой есть двойное значение ключа

    2. Попробуйте еще раз вставлять новую строку в таблицу

Возможно, что в случае двойной ключевой ошибки, механизм хранения может выполнить REPLACE поскольку обновление, а не удаление плюс вставка, но семантика является тем же самым. Нет никаких видимых пользователем эффектов кроме возможной разницы в том, как механизм хранения постепенно увеличивается Handler_xxx переменные состояния.

Поскольку результаты REPLACE ... SELECT операторы зависят от упорядочивания строк от SELECT и этот порядок не может всегда гарантироваться, возможно, регистрируя эти операторы для ведущего устройства и ведомого устройства отклониться. Поэтому REPLACE ... SELECT операторы отмечаются как опасные для основанной на операторе репликации. С этим изменением такие операторы производят предупреждение в журнале при использовании STATEMENT двоичный режим журналирования, и регистрируется, используя основанный на строке формат при использовании MIXED режим. См. также Раздел 16.1.2.1, "Преимущества и Недостатки Основанной на операторе и Построчной репликации".

В MySQL 5.7, a REPLACE оператор, влияющий на разделенную таблицу, используя механизм хранения такой как MyISAM это использует блокировки блокировок на уровне таблицы только те разделы, содержащие строки, которые соответствуют REPLACE оператор WHERE пункт, пока ни один из столбцов разделения таблицы не обновляется; иначе вся таблица блокируется. (Для механизмов хранения такой как InnoDB та работа блокировка на уровне строки, никакая блокировка разделов не имеет место.) Для получения дополнительной информации, см. Раздел 17.6.4, "Деля и Блокируя".