Spec-Zone .ru
спецификации, руководства, описания, API
|
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
,...)] SETcol_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
+ 1DEFAULT(
, таким образом, присвоение эквивалентно 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 использует следующий алгоритм для REPLACE
(и LOAD DATA ... REPLACE
):
Попытайтесь вставить новую строку в таблицу
В то время как вставка перестала работать, потому что двойная ключевая ошибка происходит для первичного ключа или уникального индекса:
Удалите из таблицы конфликтную строку, у которой есть двойное значение ключа
Попробуйте еще раз вставлять новую строку в таблицу
Возможно, что в случае двойной ключевой ошибки, механизм хранения может выполнить 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, "Деля и Блокируя".