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 Синтаксис".

Отметьте это, если у таблицы нет 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 полномочия для таблицы.

Начинание с MySQL 5.6.2, REPLACE поддерживает явный выбор раздела, используя PARTITION опция со списком разделенных запятой значений имен разделов, подразделов, или обоих. Как с INSERT, если не возможно вставить новую строку в какой-либо из этих разделов или подразделов, REPLACE оператор перестал работать с ошибкой, Найденной строкой, не соответствующей данный установленный раздел. См. Раздел 18.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 и этот порядок не может всегда гарантироваться, возможно, регистрируя эти операторы для ведущего устройства и ведомого устройства отклониться. Поэтому в MySQL 5.6.4 и позже, REPLACE ... SELECT операторы отмечаются как опасные для основанной на операторе репликации. С этим изменением такие операторы производят предупреждение в журнале при использовании STATEMENT двоичный режим журналирования, и регистрируется, используя основанный на строке формат при использовании MIXED режим. См. также Раздел 16.1.2.1, "Преимущества и Недостатки Основанной на операторе и Построчной репликации".

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