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

13.2.11. UPDATE Синтаксис

Одно-табличный синтаксис:

UPDATE [LOW_PRIORITY] [IGNORE] table_reference    SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...    [WHERE where_condition]    [ORDER BY ...]    [LIMIT row_count]

Многократно-табличный синтаксис:

UPDATE [LOW_PRIORITY] [IGNORE] table_references    SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...    [WHERE where_condition]

Для одно-табличного синтаксиса, UPDATE оператор обновляет столбцы существующих строк в именованной таблице с новыми значениями. SET пункт указывает, какие столбцы изменить и значения им нужно дать. Каждое значение может быть дано как выражение, или ключевое слово DEFAULT установить столбец явно в его значение по умолчанию. WHERE пункт, если дано, определяет условия, которые идентифицируют который строки обновить. Без WHERE пункт, все строки обновляются. Если ORDER BY пункт определяется, строки обновляются в порядке, который определяется. LIMIT пункт устанавливает границу числа строк, которые могут быть обновлены.

Для многократно-табличного синтаксиса, UPDATE строки обновлений в каждой таблице, названной в table_references это удовлетворяет условия. В этом случае, ORDER BY и LIMIT не может использоваться.

Для разделенных таблиц и одноединственные и многократно-табличные формы этого оператора поддерживают использование a PARTITION опция как часть ссылки на таблицу. Эта опция берет список одного или более разделов или подразделов (или оба). Только разделы (или подразделы) перечисленный проверяются на соответствия, и строка, которая не находится ни в одном из этих разделов или подразделов, не обновляется, удовлетворяет ли она where_condition или нет.

Отметить

В отличие от случая при использовании PARTITION с INSERT или REPLACE оператор, иначе допустимый UPDATE ... PARTITION оператор считают успешным, даже если никакие строки в перечисленных разделах (или подразделах) не соответствуют where_condition.

См. Раздел 18.5, "Выбор Раздела", для получения дополнительной информации и примеры.

where_condition выражение, которое оценивает к истине для каждой строки, которая будет обновлена. Для синтаксиса выражения см. Раздел 9.5, "Синтаксис Выражения".

table_references и where_condition определяется как описано в Разделе 13.2.9,"SELECT Синтаксис".

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

UPDATE оператор поддерживает следующие модификаторы:

В MySQL 5.6.4 и позже, UPDATE IGNORE операторы, включая тех, которые имеют ORDER BY пункт, отмечаются как опасный для основанной на операторе репликации. (Это - то, потому что порядок, в котором обновляются строки, определяет, какие строки игнорируются.) С этим изменением такие операторы производят предупреждение в журнале при использовании основанного на операторе режима и регистрируются, используя основанный на строке формат при использовании MIXED режим. (Ошибка #11758262, Ошибка #50439), См. Раздел 16.1.2.3, "Определение Безопасных и Опасных Операторов в Двоичном Журналировании", для получения дополнительной информации.

Если Вы получаете доступ к столбцу от таблицы, которая будет обновлена в выражении, UPDATE использует текущую стоимость столбца. Например, следующие наборы оператора col1 к еще одному чем его текущая стоимость:

UPDATE t1 SET col1 = col1 + 1;

Второе присвоение в следующих наборах оператора col2 к (обновленному) току col1 значение, не оригинал col1 значение. Результат - это col1 и col2 имейте то же самое значение. Это поведение отличается от стандартного SQL.

UPDATE t1 SET col1 = col1 + 1, col2 = col1;

Единственная таблица UPDATE присвоения обычно оцениваются слева направо. Для многократно-табличных обновлений нет никакой гарантии, что присвоения выполняются в любом определенном порядке.

Если Вы устанавливаете столбец в значение, оно в настоящий момент имеет, MySQL замечает это и не обновляет его.

Если Вы обновляете столбец, который был объявлен NOT NULL устанавливая в NULL, ошибка происходит, если строгий режим SQL включается; иначе, столбец устанавливается в неявное значение по умолчанию для типа данных столбца, и количество предупреждения постепенно увеличивается. Неявное значение по умолчанию 0 для числовых типов, пустая строка ('') для строковых типов, и "нулевого" значения для даты и типов времени. См. Раздел 11.5, "Значения по умолчанию Типа данных".

UPDATE возвращает число строк, которые были фактически изменены. mysql_info() C API-функция возвращает число строк, которые были соответствующими и обновлены и число предупреждений, которые произошли во время UPDATE.

Можно использовать LIMIT row_count ограничить контекст UPDATE. A LIMIT пункт является соответствующим строками ограничением. Оператор останавливается, как только он нашел row_count строки, которые удовлетворяют WHERE пункт, были ли они фактически изменены.

Если UPDATE оператор включает ORDER BY пункт, строки обновляются в порядке, определенном пунктом. Это может быть полезно в определенных ситуациях, которые могли бы иначе привести к ошибке. Предположите что таблица t содержит столбец id у этого есть уникальный индекс. Следующий оператор мог перестать работать с двойной ключевой ошибкой, в зависимости от порядка, в котором обновляются строки:

UPDATE t SET id = id + 1;

Например, если таблица содержит 1 и 2 в id столбец и 1 обновляется к 2 прежде, чем 2 будет обновлен к 3, ошибка происходит. Чтобы избежать этой проблемы, добавьте ORDER BY пункт, чтобы вызвать строки с большим id значения, которые будут обновлены перед теми с меньшими значениями:

UPDATE t SET id = id + 1 ORDER BY id DESC;

Можно также выполнить UPDATE операции, покрывающие многократные таблицы. Однако, невозможно использовать ORDER BY или LIMIT с многократной таблицей UPDATE. table_references пункт перечисляет таблицы, включенные в соединение. Его синтаксис описывается в Разделе 13.2.9.2,"JOIN Синтаксис". Вот пример:

UPDATE items,month SET items.price=month.priceWHERE items.id=month.id;

Предыдущий пример показывает внутреннее объединение, которое использует оператор запятой, но многократную таблицу UPDATE операторы могут использовать любой тип соединения, разрешенного в SELECT операторы, такой как LEFT JOIN.

Если Вы используете многократную таблицу UPDATE включение оператора InnoDB таблицы, для которых есть ограничения внешнего ключа, оптимизатор MySQL, могли бы таблицы процессов в порядке, который отличается от того из их родительского/дочернего отношения. В этом случае оператор приводит к сбою и откатывает. Вместо этого обновите единственную таблицу и положитесь ON UPDATE возможности это InnoDB обеспечивает, чтобы заставить другие таблицы быть измененными соответственно. См. Раздел 5.4.5,"InnoDB и FOREIGN KEY Ограничения".

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

Индексируйте подсказки (см. Раздел 13.2.9.3, "Индексируйте Синтаксис Подсказки"), принимаются, но игнорируются для UPDATE операторы.

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