СтатьиРабота с SQL и базами данных

Запросы SQL для обновления данных (UPDATE)

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

В SQL, изменить запись в таблице БД можно с помощью команды UPDATE. В самом минимальном виде команда обновления данных выглядит следующим образом:

UPDATE таблица SET поле = значение

Здесь, UPDATE – команда указывающая, что запрос на обновление данных;

таблица – название таблицы, в которой будет проводиться изменения;

SET – команда, после которой через запятую указываются поля с назначаемыми им значениями;

поле – поле таблицы, в которое будет внесено изменение;

значение – новое значение, которое будет внесено в поле.


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

UPDATE goods SET price = 0

В этом случае, поле price абсолютно во всех имеющиеся строках таблицы примет значение 0.

Изменение одного значения

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

Имеется таблица:

num
(номер товара)
title
(название)
price
(цена)
1Чайник300
2Чашка100
3Ложка25
4Тарелка100

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

UPDATE goods SET price = 150 WHERE num = 2

Теперь, перед операцией изменения полей, будет выбрана строка, удовлетворяющая условию num = 2. Такая строка в таблице одна. В этой стоке цена и будет изменена на значение 150. В результате получим таблицу с измененной ценой товара.

Внесение изменений в несколько строк с условием отбора

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

Например, мы хотим уменьшить в два раза цену всех товаров, которые сейчас стоят от 100 и более. Запрос:

UPDATE goods SET price = price / 2 WHERE price >= 100

Условие WHERE здесь содержит правило, по которому будут выбраны только товары с ценой равной или более 100, а те товары, цена у которых ниже 100, затронуты запросом не будут.

price = price / 2 – формула, по которой будет вычисляться новая цена товаров. Новая цена будет записана равной старой цене поделенной на два.

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

num
(номер товара)
title
(название)
price
(цена)
1Чайник150
2Чашка50
3Ложка25
4Тарелка50

Обновление значений в нескольких полях строки

При необходимости обновлять сразу несколько полей, все поля с их значениями указываются после директивы SET через запятую. Например, нужно изменить название и цену товара с кодом 2 на «утюг», стоимостью 300:

UPDATE goods SET title = "утюг", price = 300 WHERE num = 2

Такой запрос каждому соответствующему полю в строке назначит его значение. А условие укажет, в какой именно строке будут выполнены изменения.


Выше приведены основные виды операций обновления. На их основе формируется запросы для решения большинства задач изменения данных в разработке с применением SQL.


Комментарии

23.01.2017 05:15 Дмитрий [гость]
Добрый день!
А можно ли сделать так:
UPDATE goods SET title, price = 100 WHERE num = 2

То есть присвоить двум полям одно значение?
23.01.2017 21:33 Антон [администратор]
Добрый день, Дмитрий.
Нет, стоит сделать два присвоения через запятую. Кроме того, в этих полях будут разные типы данных, поэтому для title понадобятся кавычки.
22.02.2017 12:50 Анастасия [гость]
Добрый день!
Есть ли возможность запретить редактирование по некоторым полям?
Например, необходимо обновлять данные только по порядковому номеру, а по title этого делать нельзя.
22.02.2017 14:52 Антон [администратор]
Добрый день, Анастасия.
С такой проблемой, признаться, не сталкивался. В СУБД MySQL есть возможность разграничения доступов для пользователей БД. Можно так попробовать. Возможно, проще было бы сделать запрет редактирования поля в самом веб-приложение, а не на уровне БД.
18.04.2017 21:54 Татьяна [гость]
Здравствуйте!
Как можно сделать запрос, чтобы изменить данные в разных таблицах?
19.04.2017 12:09 Антон [администратор]
Добрый день, Татьяна.
Стоит использовать отдельные запросы для каждой таблицы.
22.11.2017 16:28 Настя [гость]
Добрый день. Как можно изменить поле price случайным набором чисел?
22.11.2017 16:53 Антон [администратор]
Добрый день, Анастасия.
Простейший вариант:
UPDATE goods SET price = (RAND() * 100) WHERE num = 2

Здесь назначается случайное число до 100, так как функция RAND() вернет дробное от 0 до 1. Поэтому еще стоит обратить внимание на тип поля, когда в БД запись заносится. В данном случае, без округления, вещественное может быть записано.
23.11.2017 13:47 Настя [гость]
Добрый день. Как можно изменить поле price случайным набором чисел?
23.11.2017 15:38 Антон [администратор]
Настя, добрый день.
Ответ в комментарии выше.
25.11.2017 13:03 Ильгиз [гость]
Добрый день. У меня вот есть БД mydb3 с одной таблицей people. И мне нужно реализовать разрешение параллелизма оптимистичным путем(выигрывает последний) в Си Шарп(таблица выводится в datagridview). Проблема в том, что я не могу написать SQL запрос обновления. Можете помочь с этим?
25.11.2017 17:29 Антон [администратор]
Добрый вечер, Ильгиз.
Под си шарп я не писал. Но могу сказать, что для реализации запросов должен быть подходящий компонент. Не факт, что компонент для выборки данных, будет выполнять запрос на добавление или обновление. Для проверки работоспособности, стоит использовать простейший UPDATE запрос. Когда заработает он, тогда уже реализовывать рабочий запрос для программы.
17.12.2017 15:42 Васёк [гость]
Здравствуйте! Подскажите как в одной строке таблици, заменить несколько значений одновременно!
Например (конечно неправельный) UPDATE table SET `col_param` = значение1, значение2, значение3, значение4
WHERE `nameTable` = god
17.12.2017 18:49 Антон [администратор]
Добрый день, Василий.
Одна строка таблицы - это одна запись. Если вы хотите исправить в одной записи таблице (строке таблицы), то так и будет:
UPDATE goods SET title = "утюг", price = 300 WHERE num = 2

title = "утюг", price = 300 - для каждого столбца строки.
17.12.2017 19:38 Васёк [гость]
В таблице 3 столбца. В одном из столбцов надо обновить несколько строк (данные полученные из пяти полей формы и занесены в разные переменные). UPDATE table SET `col_param` = переменная1, переменная2, переменная3, переменная4, переменная5
18.12.2017 19:07 Васёк [гость]
Например в Вашем примере таблицы расположенной в статье, нужно разом в столбце price заменить все цены (данные получены из полей формы и занесены в разные переменные)!!!
19.12.2017 10:46 Антон [администратор]
Добрый день, Василий.

Чтобы реализовать это именно одним запросом, можно сделать так. Но на мой взгляд, стоит делать проще и понятнее для себя. Ведь для сборки этого запроса вы так же будете использовать цикл. Вопрос в том, что эффективнее: реализовать циклически сложный запрос или циклически выполнить несколько простых запросов.

Подобное решение, как мне кажется применимо, например, в обновлении прайс-листа. Но, т.к. задача не часто выполнимая, то нет смысла усложнять ее, пусть даже для повышения скорости выполнения. Хотя все зависит от конкретных условий.

Надеюсь, я ответил на ваш вопрос, Василий.
20.12.2017 18:45 Васёк [гость]
Огромное спасибо Антон за совет! Буду пыхтеть над решением данной задачи. Удачи.
21.12.2017 18:40 Антон [администратор]
Взаимно, Василий.
12.01.2018 19:59 Иван [гость]
Есть простая таблица в sql. И по нажатию на кнопку сохранить выполняется сохранение изменений. Запрос такой:
$query = "UPDATE `comp` SET `comp_login`= '$comp_login', `comp_name` = '$comp_name', `see` = '$see', `p_status` = '$p_status', `comp_text` = '$comp_text' WHERE `id_comp` = '$id_comp' AND `id_clients` = '$id_clients'";
Значения переменных берутся с пост запроса. Примерно такие: $comp_login = mysql_real_escape_string($request['comp_login']);

Вопрос: Мне нужно знать была ли обновлена строка. Даже если ничего не было изменено, то тоже нужно вернуть истину.
Если проверить так: if(mysql_affected_rows() >0) , то возвращается ложь, если ничего не было изменено.

А if(mysql_affected_rows() == -1) выполняется только, если есть конкретные ошибки. Т.е. в таблице есть стpока enum со значениями '0','1'. Если я в это поле отправляю текст, то ставит 0 и пишет нет ошибки.

Как обычно проверяют такие условия?
12.01.2018 20:01 Иван [гость]
Можно конечно сделать столбец с time(), но не хочется добавить лишний столбец.
12.01.2018 21:29 Антон [администратор]
Добрый день, Иван.
Что касается такой проверки функцией mysql_affected_rows(), то она может давать не явный результат. Если в процессе работы будет выполняться множество запросов, то отслеживать таким образом были изменения или нет, не надежно.
Чаще всего в таблицах, где важно знать об изменениях, стоит все же использовать даже два дополнительных поля: "дата_создания" и "дата_редактирования". Учитывая, что типы данных у них числовые (int), то на конечный вес таблицы, они повлияют несущественно. Зато с их помощью вы сможете быть однозначно уверены на счет изменений в любой момент, а не только на этапе выполнения текущего скрипта.
13.01.2018 05:39 Иван [гость]
Спасибо большое! Хотел узнать как люди реализуют такое на практике. Тогда добавлю поле с датой последнего изменения
13.01.2018 07:26 Иван [гость]
Если в поле ENUM со значением '0', '1' ставлю значение 'stroka', то в поле ставиться пустота, хотя стоит not null, и нет никакой ошибки. Как можно получить ошибку, если в поле ставится недопустимое значение?
13.01.2018 11:26 Антон [администратор]
Доброе день, Иван.
Проверку данных лучше выполнять на уровне php (или даже на уровне формы в браузере), а не при записи в БД. БД примет данные, по возможности, преобразовывая в доступное для своего типа значение. Поэтому все проверки данных, на мой взгляд, лучше выполнить до записи.
Кроме того, если на этапе записи в БД допускаются произвольные значения, это будет существенной уязвимостью для безопасности всего приложения.
14.01.2018 08:25 Иван [гость]
Спасибо большое за ответ. В функции занесения данных в базу имеется проверка. Хотел просто узнать про возможности сделать вторую проверку на уровне СУБД.
14.01.2018 08:33 Иван [гость]
А можете ли помочь с таким вопросом:
Есть сайт технической поддержки. И есть пользователи, которые оставляют на нем заявку в компанию. На нем есть таблица с полями: id_client(id пользователя AI, PK), name_client(Имя потльзователя), status(один ко многим), date_r(дата регистрации).

Статусы у всех пользователей будут разные. Например:
у пользователя 1: открыто, отменено, закрыто, передано, принято.
у пользователя 2: открыто, отменено, закрыто, исполнено, в ожидании.
у каждого клиента должны быть видны несколько статусов для выбора (только ему принадлежащие), а у другого клиента (другие статусы, принадлежащие именно ко второму клиенту)

Статусы в любое время могут добавляться( не удаляются).
Я пока придумал только так:
1. вариант:
Вторая таблица такая: id_status, id_client, open, close, cancelled, sent, accepted.
id_status - AI PK, id_client - указывает на первую таблицу на пользователя, другие поля сами статусы и имеют значение enum: '0', '1' - в зависимости присутствует для пользователя ставиться 0 или 1.

Когда необходимо добавлять статус какому либо клиенту сначала ставлю 1 для нужного пользователя, а для всех других проставляю 0.
2 Вариант.
Во второй таблице statuses (id_statuses, name_status) записаны все статусы. В таблице пользователя в поле status записать несколько значений id_statuses разделенных разделителями, которые принадлежат ему.

Может можно реализовать попроще?
15.01.2018 14:02 Антон [администратор]
Добрый день, Иван.
Не знаю, правильно ли я понял вопрос.
Я бы сделал гораздо больше таблиц: пользователи, статусы, заявки, статусы_заявки. Последняя в случае, если одной заявке может соответствовать несколько статусов. Если нет, то она не нужна.

Например, если нужно чтобы пользователю могло быть назначено несколько статусов, то: сама таблица пользователя (id, имя, прочее), список_статусов (id, название, ...), статусы_пользователя (id, id_пользователя, id_статуса). Таим образом у вас будет обеспечена и целостность данных и не будет в таблицах не будет избыточности.
Имя:
Текст комментария:
* В комментариях запрещено публиковать рекламные объявления. Сообщения, содержащие ссылки на сторонние ресурсы добавляется в скрытом режиме. Они будут открыты, если не нарушают установленных правил, после проверки.
Защита от спам-роботов (* Обязателельно укажите ответ на простой вопрос ниже.)
Под каким номером в алфавите буква «Б»? (цифра)