Вопрос 12: Обновление данных. Обновление строк на основе данных таблицы. Обновление строк на основе данных другой таблицы.
Под обновлением данных в БД подразумевается изменение значений в существующих записях таблицы. При этом возможно как изменение значений полей в группе строк (даже всех строк таблицы), так и правка значения поля отдельной строки.
Важные моменты:
- Если инструкция UPDATE, т.е. обновление строк, нарушает какое-нибудь ограничение или правило, или новое значение имеет несовместимый тип данных (хотя бы для одной строки), то возникнет ошибка и все изменения отменяются, никакие строки не обновляются;
- По умолчанию инструкция UPDATE получает монопольную блокировку на целевую таблицу, которую она изменяет, это означает, что пока одна инструкция UPDATE выполняется, т.е. изменяет данные в таблице, другие инструкции не могут изменять данные в этой таблице;
- Чтобы использовать инструкцию UPDATE, нужны соответствующие разрешения на изменение данных, а также на чтение данных, если инструкция содержит условие WHERE;
- Если Вам нужно узнать количество строк, которые Вы обновили инструкцией UPDATE, например, для возврата в клиентское приложение или для любых других целей, то для этого Вы можете использовать функцию @@ROWCOUNT.
В SQL, изменить запись в таблице БД можно с помощью команды UPDATE.
UPDATE Целевая таблица SET Имя столбца = Значение
FROM Таблица источник
WHERE Условие
Где UPDATE – инструкция обновления; Целевая таблица – таблица, данные в которой необходимо изменить; SET – команда, которая задает список обновляемых столбцов. Каждый следующий столбец указывается через запятую; Имя столбца – столбец, в котором расположены данные, которые необходимо изменить; Значение – новое значение, на которое необходимо изменить значение столбца. Можно указывать как конкретное значение, так и расчётное выражение, функцию или подзапрос. Также можно указать ключевое слово DEFAULT, что будет означать, что столбцу необходимо присвоить значение по умолчанию; FROM – секция, которая указывает таблицу, из которой необходимо взять новое значение столбца. Секция может содержать объединение JOIN; Таблица источник – таблица, в которой расположено новое значение столбца; WHERE – условие отбора строк, подлежащих обновлению.
Например, если необходимо задать полю во всех строках таблицы значение равное нулю, можно выполнить такой запрос:
UPDATE goods
SET price = 0
В этом случае, поле price абсолютно во всех имеющиеся строках таблицы примет значение 0.
Обновление строк на основе данных таблицы
Cинтаксис:
UPDATE {table_name | view_name}
SET { column_name = {expression | DEFAULT | NULL} |
@variable=expression}[,.n]
WHERE {search_conditions}
Изменение значения всех полей в таблице необходимо крайне редко. Чтобы изменить значение какой-то конкретной записи в завершении строки с командой UPDATE будет добавлена директива WHERE, в которой указывается условие, определяющее с какой именно строкой нужно выполнить операцию обновления.
num | title | price |
---|---|---|
1 | Чайник | 300 |
2 | Чашка | 200 |
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, затронуты запросом не будут.
В результате получим талицу:
num | title | price |
---|---|---|
1 | Чайник | 150 |
2 | Чашка | 100 |
3 | Ложка | 25 |
4 | Тарелка | 50 |
Обновление значений в нескольких полях строки. Тогда все поля, которые нужно изменить, с их значениями указываются после директивы SET через запятую. Например, нужно изменить название и цену товара с кодом 2 на «утюг», стоимостью 300:
UPDATE goods
SET title = "утюг", price = 300
WHERE num = 2
Такой запрос каждому соответствующему полю в строке назначит его значение. А условие укажет, в какой именно строке будут выполнены изменения.
Обновление строк на основе данных другой таблицы
Синтаксис:
UPDATE {table_name | view_name}
SET
{ column_name={expression | DEFAULT | NULL}
|@variable=expression}[,.n]
[FROM { <table_source>]
[WHERE search_conditions]
Например:
UPDATE products
SET unitprice = unitprice + 2
FROM products
INNER JOIN suppliers ON products.supplierid = suppliers.supplierid
WHERE suppliers.country = 'USA'
GO