Spec-Zone .ru
спецификации, руководства, описания, API
|
Одно-табличный синтаксис:
UPDATE [LOW_PRIORITY] [IGNORE]table_reference
SETcol_name1
={expr1
|DEFAULT} [,col_name2
={expr2
|DEFAULT}] ... [WHEREwhere_condition
] [ORDER BY ...] [LIMITrow_count
]
Многократно-табличный синтаксис:
UPDATE [LOW_PRIORITY] [IGNORE]table_references
SETcol_name1
={expr1
|DEFAULT} [,col_name2
={expr2
|DEFAULT}] ... [WHEREwhere_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
оператор поддерживает следующие модификаторы:
С LOW_PRIORITY
ключевое слово, выполнение UPDATE
задерживается, пока никакие другие клиенты не читают из таблицы. Это влияет только на механизмы
хранения, которые используют только блокировку на уровне таблицы (такой как MyISAM
, MEMORY
, и MERGE
).
С IGNORE
ключевое слово, оператор обновления не
прерывается, даже если ошибки происходят во время обновления. Строки, для которых происходят двойные
ключевые конфликты, не обновляются. Строки, для которых столбцы обновляются к значениям, которые вызвали
бы ошибки преобразования данных, обновляются к самым близким допустимым значениям вместо этого.
В 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, "Деля и Блокируя".