Однотабличный синтаксис:
UPDATE [LOW_PRIORITY] [IGNORE] шя_таблтш
SET имя_столбца1=выражение1 [,имя_столбца2=выражение2 …]
[WHERE олределение_where]
[ORDER BY …]
[LIMIT количество_строк]
Многотабличный синтаксис:
UPDATE [LOW_PRIORITY] [IGNORE] имя_таблицы [, имя_таблицы …] SET имя_столбца 1=выражение1 [,имя_столбца2=выражение2 …] [WHERE олределеяие_where]
Оператор UPDATE обновляет столбцы существующих строк таблицы новыми значениями. Конструкция SET перечисляет столбцы, подлежащие модификации, и значения, которые им присваиваются. Если указана конструкция WHERE, она задает, какие строки должны быть обновлены. В противном случае обновляются все строки таблицы. Если указана конструкция ORDER BY, строки будут обновлены в заданном порядке. Конструкция LIMIT накладывает ограничение на количество обновляемых строк.
Оператор UPDATE поддерживает следующие модификаторы:
- Если указано ключевое слово LOW_PRIORITY, выполнение UPDATE откладывается до тех пор, пока все другие клиенты завершат чтение таблицы.
- Если указано ключевое слово IGNORE, операция обновления не будет прервана, даже если возникнут ошибки дублирования ключа. Строки, которые приводят к конфликтам, обновлены не будут.
Если вы используете столбцы из таблицы имя_таблицы в выражениях, UPDATE использует текущее значение столбцов. Например, следующий оператор увеличивает значение столбца age на единицу:
mysql> UPDATE persondata SET age=age+l;
Присвоения в UPDATE выполняются слева направо. Например, следующий оператор удваивает значение столбца age, а затем увеличивает на единицу: mysql> UPDATE persondata SET age=age*2, age=age+l;
Если вы устанавливает значение столбца в то, которое он имеет, MySQL обнаруживает это и не выполняет обновление.
Если вы обновляете столбец, который была объявлен как NOT null, присваивая ему значение NULL, он устанавливается в значение по умолчанию, соответствующее конкретному типу данных и увеличивает счетчик предупреждений на единицу. Значение по умолчанию равно 0 для числовых столбцов, пустая строка (”) для символьных и “нулевое” значение для столбцов типа даты и времени.
UPDATE возвращает количество строк, которые фактически были обновлены. В MySQL 3.22 и более поздних версиях функция mysql_info() программного интерфейса С API возвращает количество строк, которые соответствовали запросу и были обновлены, а также количество предупреждений, возникших во время выполнения UPDATE.
Начиная с MySQL 3.23, можно использовать limit количество_строк для ограничения области действия UPDATE.
Конструкция LIMIT работает следующим образом:
- До MySQL 4.0.13 LIMIT была ограничением количества обработанных строк. Оператор завершал работу, как только обновлял количество_строк строк, удовлетворявших условию WHERE.
- Начиная с MySQL 4.0.13, limit – ограничение соответствия строк. Оператор завершает работу, как только найдет количество_строк строк, удовлетворяющих условию WHERE, независимо от того, были ли они действительно обновлены.
Если оператор UPDATE включает конструкцию order by, то строки обновляются в порядке, заданном этой конструкцией. ORDER BY может применяться, начиная с MySQL 4.0.0.
Начиная с MySQL 4.0.0, также можно выполнять операции UPDATE, которые работают с несколькими таблицами сразу:
UPDATE items,month SET items.price=month.price WHERE items.id-month. id/ Этот пример демонстрирует внутреннее объединение, использующее оператор запятой, но многотабличные UPDATE могут использовать любой тип объединений, допустимый в операторе SELECT, например, LEFT JOIN.
На заметку!
- Вы не можете применять ORDER BY или LIMIT в многотабличных операторах UPDATE.
Если вы используете многотабличный оператор UPDATE в отношении таблиц InnoDB, у которых определены ограничения внешних ключей, оптимизатор MySQL может обрабатывать их в порядке, отличном от того, который задается их отношениями “родительский-дочерний”. В этом случае оператор завершится ошибкой и будет выполнен откат транзакции. Вместо этого обновляйте одну таблицу и полагайтесь на свойство ON UPDATE, которое предоставляет механизм InnoDB для автоматического обновления связанных таблиц.