Команда UPDATE
Часто возникает необходимость изменения информации, хранящейся в базе данных. С помощью команды UPDATE
вы сможете обновлять данные одной или нескольких колонок в каждой записи таблицы.
Синтаксис запроса на обновление данных.
1 |
UPDATE table_name SET column1=new_value, column2=new_value WHERE condition; |
Для примера заполним таблицу books для хранения книг из условной базы данных Bookstore, которую мы создали в одном из предыдущех постов.
Сначала выберем базу данных, для которой будем выполнять запросы.
1 |
USE Bookstore; |
Посмотрим какие данные сейчас хранятся в колонках id, title, author, price, discount, amount таблицы books для первых 5 записей.
mysql> SELECT id, title, author, price, discount, amount FROM books LIMIT 5;
+----+--------------------------+-------------------+--------+----------+--------+
| id | title | author | price | discount | amount |
+----+--------------------------+-------------------+--------+----------+--------+
| 1 | Дубровский | Александр Пушкин | 230.00 | 0 | 4 |
| 2 | Нос | Николай Гоголь | 255.20 | 0 | 7 |
| 3 | Мастер и Маргарита | Михаил Булгаков | 240.50 | 0 | 10 |
| 4 | Мёртвые души | Николай Гоголь | 173.00 | 0 | 3 |
| 5 | Преступление и наказание | Фёдор Достоевский | 245.00 | 0 | 3 |
+----+--------------------------+-------------------+--------+----------+--------+
5 rows in set (0.00 sec)
mysql>
Обновим цену, процент скидки и уменьшим количество на 2 для книги с идентификатором 3.
1 |
UPDATE books SET price=263.00, discount=10, amount=amount-2 WHERE id=3; |
Теперь проверим как обновились данные.
mysql> UPDATE books
-> SET price=263.00, discount=10, amount=amount-2
-> WHERE id=3;
Query OK, 1 rows affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> SELECT id, title, author, price, discount, amount FROM books LIMIT 5;
+----+--------------------------+-------------------+--------+----------+--------+
| id | title | author | price | discount | amount |
+----+--------------------------+-------------------+--------+----------+--------+
| 1 | Дубровский | Александр Пушкин | 230.00 | 0 | 4 |
| 2 | Нос | Николай Гоголь | 255.20 | 0 | 7 |
| 3 | Мастер и Маргарита | Михаил Булгаков | 263.00 | 10 | 8 |
| 4 | Мёртвые души | Николай Гоголь | 173.00 | 0 | 3 |
| 5 | Преступление и наказание | Фёдор Достоевский | 245.00 | 0 | 3 |
+----+--------------------------+-------------------+--------+----------+--------+
5 rows in set (0.00 sec)
mysql>
Обновление данных для нескольких записей в MySQL
Используя команду WHERE
можно задавать сразу несколько записей для обновления данных.
Попробуем добавить скидку в 5% для всех книг под авторством Николая Гоголя, а также в название книги добавим слово "(Акция)".
Запрос на обновление данных, в этом случае, будет выглядеть так:
1 |
UPDATE books SET discount=5, title=CONCAT(title," (Акция)") WHERE author="Николай Гоголь"; |
В запросе используется функция CONCAT()
, которая прибавляет к текущему значению поля title строку "(Акция)".
В результате получим следующие изменения.
mysql> UPDATE books
-> SET discount=5, title=CONCAT(title," (Акция)")
-> WHERE author="Николай Гоголь";
Query OK, 2 rows affected (0.00 sec)
Rows matched: 2 Changed: 2 Warnings: 0
mysql> SELECT id, title, author, price, discount, amount FROM books LIMIT 5;
+----+--------------------------+--------------------+--------+----------+--------+
| id | title | author | price | discount | amount |
+----+--------------------------+--------------------+--------+----------+--------+
| 1 | Дубровский | Александр Пушкин | 230.00 | 0 | 4 |
| 2 | Нос (Акция) | Николай Гоголь | 255.20 | 5 | 7 |
| 3 | Мастер и Маргарита | Михаил Булгаков | 263.00 | 10 | 8 |
| 4 | Мёртвые души (Акция) | Николай Гоголь | 173.00 | 5 | 3 |
| 5 | Преступление и наказание | Фёдор Достоевский | 245.00 | 0 | 3 |
+---------+--------------------------+--------------------+--------+----------+--------+
5 rows in set (0.00 sec)
mysql>
Будьте предельно внимательны при обновлении данных в таблицах, так как если вы вдруг забудете задать условие обновления и не напишите команду WHERE
, то указанное в запросе обновление будет применено ко всем строкам в таблице!
Пример того, что может получится если не указать команду WHERE
.
1 |
UPDATE books SET price=103.90, title="Барышня-крестьянка"; |
В результате запроса выше получим одинаковую цену и название для всех книг в таблице.
mysql> UPDATE books SET price=103.90, title="Барышня-крестьянка";
Query OK, 5 rows affected (0.00 sec)
Rows matched: 5 Changed: 5 Warnings: 0
mysql> SELECT id, title, author, price, discount FROM books LIMIT 5;
+----+------------------------+--------------------+--------+----------+
| id | title | author | price | discount |
+----+------------------------+--------------------+--------+----------+
| 1 | Барышня-крестьянка | Александр Пушкин | 103.90 | 0 |
| 2 | Барышня-крестьянка | Николай Гоголь | 103.90 | 5 |
| 3 | Барышня-крестьянка | Михаил Булгаков | 103.90 | 10 |
| 4 | Барышня-крестьянка | Николай Гоголь | 103.90 | 5 |
| 5 | Барышня-крестьянка | Фёдор Достоевский | 103.90 | 0 |
+----+------------------------+--------------------+--------+----------+
5 rows in set (0.00 sec)
mysql>
Как обновить записи в таблице базы данных MySQL с помощью PHP (PDO)
Для обновления большого количества данных, гораздо удобнее будет воспользоваться HTML-формой, поля которой будут соответствовать полям таблицы из базы данных. Форму разместим в файле index.php
.
Перед созданием формы мы обратимся к нашей таблице books и выведем данные, которые в ней хранятся, просто для того чтобы видеть, что содержит таблица и не редактировать ее вслепую.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>UPDATE</title> <style> label{display: inline-block;width: 170px;} form > div{margin-bottom: 5px;} td:nth-child(5),td:nth-child(6){text-align:center;} table{border-spacing: 0;border-collapse: collapse;} td, th{padding: 10px;border: 1px solid black;} </style> </head> <body> <?php $db_server = "localhost"; $db_user = "root"; $db_password = "MySafePass4!"; $db_name = "Bookstore"; try { // Открываем соединение, указываем адрес сервера, имя бд, имя пользователя и пароль, // также сообщаем серверу в какой кодировке должны вводится данные в таблицу бд. $db = new PDO("mysql:host=$db_server;dbname=$db_name", $db_user, $db_password,array(PDO::MYSQL_ATTR_INIT_COMMAND=>"SET NAMES utf8")); // Устанавливаем атрибут сообщений об ошибках (выбрасывать исключения) $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // Запрос на вывод записей из таблицы $sql = "SELECT id, title, author, price, discount, amount FROM books LIMIT 5"; // Подготовка запроса $statement = $db->prepare($sql); // Выполняем запрос $statement->execute(); // Получаем массив строк $result_array = $statement->fetchAll(); echo "<table><tr><th>ID</th><th>Title</th><th>Author</th><th>Price</th><th>Discount</th><th>Amount</th></tr>"; foreach ($result_array as $result_row) { echo "<tr>"; echo "<td>" . $result_row["id"] . "</td>"; echo "<td>" . $result_row["title"] . "</td>"; echo "<td>" . $result_row["author"] . "</td>"; echo "<td>" . $result_row["price"] . "</td>"; echo "<td>" . $result_row["discount"] . "</td>"; echo "<td>" . $result_row["amount"] . "</td>"; echo "</tr>"; } echo "</table>"; } catch(PDOException $e) { echo "Ошибка при создании записи в базе данных: " . $e->getMessage(); } // Закрываем соединение $db = null; ?> <h2>Команда UPDATE</h2> <form action="update.php" method="POST"> <div> <label for="ID">Выберите ID строки *:</label> <input type="number" id="ID" name="book_id" required> </div> <div> <label for="Title">Название книги:</label> <input type="text" id="Title" name="book_title"> </div> <div> <label for="Author">Имя автора:</label> <input type="text" id="Author" name="book_author"> </div> <div> <label for="Price">Цена:</label> <input type="number" id="Price" name="book_price"> </div> <div> <label for="Discount">Скидка:</label> <input type="number" min="0" max="100" id="Discount" name="book_discount"> </div> <div> <label for="Amount">Количество:</label> <input type="number" id="Amount" name="book_amount"> </div> <input type="submit" value="Обновить запись"> </form> </body> </html> |
В результате получится следующая страница с формой для редактирования записей в таблице books.

Далее нам понадобится файл update.php
для составления и выполнения запроса на редактирование таблицы books, на основе данных полученных в форме.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
<?php $db_server = "localhost"; $db_user = "root"; $db_password = "MySafePass4!"; $db_name = "Bookstore"; try { // Открываем соединение, указываем адрес сервера, имя бд, имя пользователя и пароль, // также сообщаем серверу в какой кодировке должны вводится данные в таблицу бд. $db = new PDO("mysql:host=$db_server;dbname=$db_name", $db_user, $db_password,array(PDO::MYSQL_ATTR_INIT_COMMAND=>"SET NAMES utf8")); // Устанавливаем атрибут сообщений об ошибках (выбрасывать исключения). $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // Переносим данные из полей формы в переменные. $book_id = $_POST['book_id']; $book_title = $_POST['book_title']; $book_author = $_POST['book_author']; $book_price = $_POST['book_price']; $book_discount = $_POST['book_discount']; $book_amount = $_POST['book_amount']; // Если пользователь не указал (номер Id) какую запись будем редактировать, // то прерываем выполнение кода. if(empty($book_id)){ echo "Вы не задали ID строки для обновления данных!"; return; } // Составвлям массив колонок для запроса обновления. // Если поле формы не пустое, то его значение будет добавлено в запрос. $update_columns = array(); if(trim($book_title) !== "") { $update_columns[] = "title = :title"; } if(trim($book_author) !== "") { $update_columns[] = "author = :author"; } if(trim($book_price) !== "") { $update_columns[] = "price = :price"; } if(trim($book_discount) !== ""){ $update_columns[] = "discount = :discount"; } if(trim($book_amount) !== "") { $update_columns[] = "amount = :amount"; } // Если есть хоть одно заполненное поле формы, // то составляем запрос. if(sizeof($update_columns > 0)){ // Запрос на создание записи в таблице $sql = "UPDATE books SET " . implode(", ", $update_columns) . " WHERE id=:id"; // Перед тем как выполнять запрос предлагаю убедится, что он составлен без ошибок. // echo $sql; // Например, если в форме заполнены поля: название, автор книги и номер Id=1, // то запрос должен выглядеть следующим образом: // "UPDATE books SET title = :title, author = :author WHERE id=:id" // Подготовка запроса. $statement = $db->prepare($sql); // Привязываем к псевдо переменным реальные данные, // если они существуют (пользователь заполнил поле в форме). $statement->bindParam(":id", $book_id); if(trim($book_title) !== ""){ $statement->bindParam(":title", $book_title); } if(trim($book_author) !== ""){ $statement->bindParam(":author", $book_author); } if(trim($book_price) !== ""){ $statement->bindParam(":price", $book_price); } if(trim($book_discount) !== ""){ $statement->bindParam(":discount", $book_discount); } if(trim($book_amount) !== ""){ $statement->bindParam(":amount", $book_amount); } // Выполняем запрос. $statement->execute(); echo "Запись c ID: " . $book_id . " успешно обновлена!"; } } catch(PDOException $e) { echo "Ошибка при обновлении записи в базе данных: " . $e->getMessage(); } // Закрываем соединение. $db = null; ?> |
Чтобы убедится в успешности работы можем еще раз запустить страницу index.php
, на которой можно увидеть обновленную запись с id=1.

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