Истории успеха наших клиентов — лучшие проекты
Вход/ Регистрация

Команда UPDATE, или Как обновить данные в таблице MySQL

30965
12 минут чтения
Средний рейтинг статьи: 4

Обновление данных в базах — один из ключевых элементов при работе в MySQL. Под обновлением подразумевается изменение значений в существующих записях таблицы. Обновление допускает различные варианты: как изменение значений полей в группе строк (в том числе и всех строк таблицы), так и корректировку значения поля отдельной строки. 

Для полноценной работы как с локальными базами данных, так и с облачными базами данных timeweb.cloud, важно понимать синтаксис команд для обновления данных.

Команда Update Или Как Обновить Данные В Таблице My SQL (1)

Ключевой командой для изменения записей в таблице базы данных в MySQL является UPDATE. Обновление происходит последовательно, от первой до последней строки, по порядку. В зависимости от типа обновления в MySQL выделяется два синтаксиса для оператора UPDATE

В случае обновления одной таблицы синтаксис выглядит следующим образом:

    

Обязательный параметр:

SET assignment_list указывает, какие столбцы нужно изменить и каким образом (assignment_list — список столбцов и новых значений).

Необязательные параметры:

  • LOW_PRIORITY если указан этот параметр, выполнение UPDATE откладывается до тех пор, пока другой пользователь не решит просмотреть данные таблицы.
  • IGNORE в этом сценарии выполнение UPDATE не прерывается, даже если в процессе возникают какие-либо ошибки. Если возникают дубликаты в столбце с уникальным ключом, то такие строки не обновляются. 
  • WHERE where_condition широко известный оператор задает условия, по которым отбираются строки для обновления (where_condition — список условий). Если параметры WHERE не указаны, обновятся все строки таблицы.
  • ORDER BY если указан этот параметр, строки обновляются в заданном порядке.
  • LIMIT row_count ограничение на количество обновляемых строк (row_count некое число строк). Считаются строки, которые попадают под условие WHERE, независимо от того, изменились они или нет. 

В случае обновления нескольких таблиц одновременно синтаксис будет следующим:

    

table_references список таблиц, которые мы хотим изменить. Они изменятся таким образом, как указано в assignment_list

При обновлении нескольких таблиц нельзя использовать параметр ORDER BY или LIMIT. Помимо этого, при обновлении нескольких таблиц нет гарантий, что они будут обновлены в указанном порядке.

Остальные параметры запроса (необязательные) — LOW_PRIORITY, IGNORE и WHERE — работают так же, как в сценарии обновления одной таблицы.

Итак, давайте рассмотрим примеры использования оператора UPDATE в MySQL.

Для начала создадим базу данных для книжного магазина. В ней будет 4 таблицы: книги, жанры, писатели и покупки. 

Воспользуемся операторами CREATE TABLE и INSERT INTO, чтобы создать таблицы author, genre, book и sales. 

    

 Получаем следующие таблицы. Таблица book:

1

Столбцы:

  • book_id – уникальный идентификатор книги;
  • title – название книги;
  • author_id – идентификатор автора (внешний ключ);
  • genre_id – идентификатор жанра (внешний ключ);
  • price – цена книги за один экземпляр; 
  • amount – количество книг на складе.

Таблица genres:

2

Столбцы: 

  • id – уникальный идентификатор;
  • name_genre – обозначение жанра.

Таблица author:

3

Столбцы:

  • id – уникальный идентификатор;
  • name_author – имя автора книги.

Таблица sales:

4

Столбцы:

  • id – уникальный идентификатор операции;
  • book_id – уникальный идентификатор книги из таблицы book (внешний ключ);
  • count – количество купленных книг;
  • cost – общая стоимость товаров.

Операции по обновлению данных

Теперь, создав образец базы данных, мы покажем выполнение различных операций по обновлению данных с использованием оператора UPDATE и других команд в MySQL

1. Обновление всех строк

Если при использовании UPDATE вы не используете задающий условия параметр WHERE, то будут обновлены все строки в таблице. Предположим, в книжном магазине проходит акция «Всё по 500» — изменим цену всех книг на фиксированную 500 рублей:

    

В результате выполнения запроса мы получим такую табличку:

5

Если мы попробуем присвоить значение, которое уже находится в столбце, то MySQL заметит это и не обновит его.

Если мы захотим присвоить значение NULL столбцу, при создании которого было указано NOT NULL, то запрос вернет ошибку: 

    

В то же время, если указать параметр IGNORE, то значение будет изменено на значение по умолчанию для конкретного типа: 0 для числовых, “” для символьных и «нулевое» для дат. Например, 0000 для типа данных YEAR или 0000-00-00 00:00:00 для типа DATETIME.

DBaaS

Запустите свою базу данных в облаке и
оптимизируйте процессы DevOps и CI/CD.

2. Обновление строк с условием

Изменение всех строк таблицы требуется довольно редко. Гораздо чаще нам необходимо обновить значения для какой-то конкретной записи или для нескольких. Допустим, мы хотим изменить строки по какому-то условию. Например, устроим распродажу книг, которых осталось в наличии меньше 5 штук. Для этого в MySQL с командой UPDATE используем оператор WHERE:

    

Результат выполнения запроса:

6

Хорошо видно, что изменились только строки с книгами Dead Souls и Iliad, так как только они удовлетворяли прописанному в запросе условию.

3. Обновление значений с выражением

При обновлении мы можем задавать столбцу не только статичное значение, но и выражения. Предположим, в магазине проходит акция, и на книги русских писателей объявлена скидка в 15%:

    

В таблице author имеется только два русских писателя – Leo Tolstoy и Nikolai Gogol с author_id 1 и 3 соответственно.

Результат выполнения запроса:

7

Обновление значений происходит в определенном порядке: слева направо. Например, следующий запрос сначала увеличит значение amount на 1, а потом удвоит его:

    

Результат выполнения запроса:

8

4. Обновление с DEFAULT

Также мы можем изменить значение строк на значения «по умолчанию» DEFAULT, которые задаются при создании или изменении таблицы. Для того чтобы узнать, какие значения в нашей таблице используются по умолчанию, выполним запрос:

    

В результате получим следующую структуру нашей таблицы в MySQL:

9

Заменим значения столбца amount на значение DEFAULT. Так как по умолчанию значение для amount было 0, мы должны получить все 0:

    

Результат выполнения запроса соответствует ожиданиям:

10

5. Обновление нескольких столбцов

Используя один запрос, мы можем обновить сразу несколько столбцов. Например, изменим значения цены и количества у строк со значением book_id < 4:

    

Результат выполнения запроса:

11

6. Использование LIMIT

Используя параметр LIMIT, мы можем ограничить количество записей, которые должны быть обновлены. Например, обновим только первую строку:

    

В таблице имеется две строки с genre_id равным 4, но, так как мы указали LIMIT 1, обновится только одна:

12

Также следует отметить, что LIMIT N вовсе не означает, что мы обновим N строк. В результате запроса произойдёт обработка первых N строк, подходящих под условие WHERE, независимо от того, обновились эти строки в итоге или нет.

7. Обновление нескольких таблиц

В MySQL мы можем обновить сразу несколько таблиц:

    

Результат запроса в таблице book:

13

Результат запроса в таблице authors:

14

8. Обновление таблиц с объединением (INNER JOIN)

Во время обновления можно также объединять таблицы при помощи команды INNER JOIN.

    

15

Указывать INNER необязательно, так как этот тип объединения используется по умолчанию. Запрос можно переписать следующим образом, и мы получим такой же результат:

    

9. Обновление таблиц с объединением (LEFT JOIN)

Также мы можем использовать LEFT JOIN. В этом случае обязательно указывать, что мы используем именно левое объединение. Например, можно изменить на складе количество книг после их покупки. Добавим в таблицу sales две строки:

    

Магазин продал 3 книги Anna Karenina и 1 книгу Dead Souls. Выполним запрос: 

    

В итоге обновления видим, что количество книг на складе уменьшилось (для тех, которые мы продали):

16

Если мы попробуем не использовать LEFT JOIN, то получим ошибку «Out of range value for column 'amount' at row 3», т.к. amount не может быть отрицательным. Или, если добавить IGNORE, получим:

17

Как можно видеть в данном случае во всех строках количество уменьшилось на три книги, что нам не очень подходит.

10. Обновление с CASE, IF, IFNULL, COALESCE

При обновлении таблицы также возможно использовать условные операторы, такие как CASE, IF и т.д.

Функция CASE проверяет истинность набора условий и, в зависимости от результата, возвращает один из возможных результатов. Синтаксис при работе с UPDATE в MySQL для операторов CASE и WHEN будет следующий:

    

В данном случае, если книга имеет жанр 1 мы устанавливаем стоимость 100, если жанр 2 – стоимость 150.

Результат выполнения запроса:

18

Функция IF в зависимости от результата условного выражения возвращает одно из двух значений. Если книга имеет жанр 4, то мы уменьшаем ее стоимость на 200, иначе оставляем стоимость прежней:

    

Результат выполнения запроса:

19

Функция IFNULL проверяет значение выражения – если оно имеет значение NULL, то возвращается определенное значение, в противном случае возвращается само выражение. Пусть одно из значений amount оказалось NULL:

20

Проверим все значения в столбце amount, и если встретится NULL, заменим его на 0: 

    

Результат выполнения запроса:

21

Функция COALESCE довольна похожа на IFNULL. Основная особенность заключается в том, что данная функция может принимать сразу несколько значений (два и более). Как и IFNULL, возвращает первое не равное NULL.

Для того чтобы посмотреть, как работает этот вариант, создадим таблицу следующего вида:

22

И выполним запрос:

    

Результат выполнения запроса:

23

11. Обновление с сортировкой

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

    

Результат выполнения запроса:

24

12. Обновление на основе данных из других таблиц

Также в MySQL при работе с UPDATE в условии WHERE возможно использовать вложенные команды SELECT и FROM. В рассматриваемом примере мы сначала получаем идентификатор жанра 'Epic poetry', а потом на основе полученного значения отбираем строки для обновления таблицы. 

    

25

Как вариант, мы можем выбрать значения, которые нужно изменить, используя запрос: 

    

Мы изменяем значения price всех книг, у которых количество на складе меньше 5, на минимальную сумму продажи. 

26

Минимальная сумма продаж у нас 480:

27

В этой ситуации невозможно обновить таблицу, выбрав значения из той же таблицы в подзапросе. Но есть вариант использовать небольшую хитрость – мы можем объединить таблицу с собой:

    

В данном случае подзапрос создает временную таблицу для присоединения и закрывает ее до того, как начнется выполнение UPDATE.

Подзапрос находит минимальное количество книг для каждого жанра, после чего используется для обновления столбца amount. В нашей таблице только у жанра 4 имеется больше одной строки. Значения в обеих строках должно замениться на минимальное для этого жанра – 4.

Результат выполнения запроса:

28

Есть еще один вариант обновления – использование SELECT FROM SELECT:

    

В данном случае также создается временная таблица. Однако в этом случае присваивается только одно значение всем строкам.

Разверните базу данных в облаке в один клик

Cloud DB 1/1/8

447 ₽/мес

Процессор
1 x 3.3 ГГц
Память
1 ГБ
Диск NVMe
8 ГБ
Приватный IP
Есть
Резервные копии
Есть
Cloud DB 1/2/20

711 ₽/мес

Процессор
1 x 3.3 ГГц
Память
2 ГБ
Диск NVMe
20 ГБ
Приватный IP
Есть
Резервные копии
Есть
Таблица тарифов
Сравнение тарифов
Cloud DB 1/1/8
496
Cloud DB 1/2/20
790
Cloud DB 2/2/30
1160
Cloud DB 2/4/40
1580
Cloud DB 4/8/80
3160
Cloud DB 4/12/120
4240
Cloud DB 6/12/180
5460
Cloud DB 8/16/220
7040
Процессор1 x 3.3 ГГц1 x 3.3 ГГц2 x 3.3 ГГц2 x 3.3 ГГц4 x 3.3 ГГц4 x 3.3 ГГц6 x 3.3 ГГц8 x 3.3 ГГц
Память1 ГБ2 ГБ2 ГБ4 ГБ8 ГБ12 ГБ12 ГБ16 ГБ
Диск NVMe8 ГБ20 ГБ30 ГБ40 ГБ80 ГБ120 ГБ180 ГБ220 ГБ
Приватный IPЕстьЕстьЕстьЕстьЕстьЕстьЕстьЕсть
Резервные копииЕстьЕстьЕстьЕстьЕстьЕстьЕстьЕсть

Заключение

Мы постарались максимально подробно раскрыть особенности применения оператора UPDATE в MySQL. Но, конечно, практическое применение может продемонстрировать немало других интересных вариантов.

30965
12 минут чтения
Средний рейтинг статьи: 4
Хотите внести свой вклад?
Участвуйте в нашей контент-программе за
вознаграждение или запросите нужную вам инструкцию
img-server