□ UPDATE p r o d u c t s
SET
p r i c e = p r i c e * 1.20,
name = LOWER(name)
WHERE
p r i c e >= 20;
3 rows updated.
Оператор обновляет 3 строки. В этом можно убедиться, используя следующий
запрос:
□ SELECT product_id, name, price
FROM products
WHERE price >= (20 * 1.20);
ID NAME PRICE
2 c h em i s t r y 36
3 s u p e rn o v a 3 1 .1 9
5 z - f i l e s 5 9 .9 9
Примечание В операторе UPDATE можно использовать подзапросы (см. главу 6).
266 Глава 8
Фраза RETURNING
В OraclelOg для возврата значения из агрегатной функции (например,
AVG()) можно использовать фразу RETURNING (об агрегатных функциях см.
главу 4).
В приведенном ниже примере выполняются следующие задачи:
■ Объявляется переменная a v e r a g e _ p r o d u c t _ p r i c e
■ Производится уменьшение столбца цены (price) в таблице products и
средняя цена товаров запоминается в переменной a v e r a g e _ p r o d u c t_
p r i c e с использованием фразы RETURNING
■ Распечатывается значение переменной average_product_price
□ VARIABLE average_product_price NUMBER
UPDATE products
SET price = price * 0.75
RETURNING AVG(price) INTO :average_product_price;
12 rows updated.
PRINT a v e r a g e _ p r o d u c t _ p r i c e
AVERAGE_PRODUCT_PRICE
16.1216667
Удаление строк при помощи оператора DELETE
Оператор DELETE используется для удаления строк из таблицы. Обычно
нужно указывать фразу WHERE, с помощью которой можно ограничить число
удаляемых строк. Если этого не сделать, будут удалены все строки.
Следующий оператор DELETE удаляет строку из таблицы customers, для
которой значение c u s t om e r _ id равно 10 :
□ DELETE FROM customers
WHERE customer_id = 10;
1 row d e le t e d .
SQITPlus подтверждает, что удалена одна строка.
В операторе DELETE можно использовать подзапросы (см. главу 6).
Примечание Если вы выполняли все приведенные выше операторы INSERT, UPDATE и
DELETE, откатите выполненные изменения с помощью оператора ROLLBACK. Если вы отключились
от базы данных раньше, чем попытались сделать откат, не расстраивайтесь: просто выполните
повторно сценарий store_schema.sql и создайте все заново. __________________
Целостность базы данных
Когда выполняется оператор DML (например, INSERT, UPDATE или DELETE),
база данных гарантирует, что строки таблиц сохранят свою целостность.
Изменение содержимого таблиц 267
Это означает, что любые производимые в таблицах изменения всегда
должны сохранять отношения первичных и внешних ключей для этой таблицы.
Принудительное применение ограничений первичного ключа
Ниже приведены некоторые примеры принудительного применения
ограничений первичного ключа. Первичным ключом таблицы customers
является столбец custome r id . Это означает, что каждое значение этого
столбца должно быть уникальным. Если попытаться вставить в таблицу
строку с повторяющимся значением столбца первичного ключа, база данных
выдаст сообщение об ошибке ORA-OOOOclass="underline"
□ SQL> INSERT INTO c u s tom e r s (
2 c u s tom e r _ id , f i r s t _ n am e , la s t_ n ame , dob, phone .
3 ) VALUES (
4 1 , ‘ J a s o n ’ , ‘ P r i c e ’ , ‘ 01 - J A N - 6 0 ’ , ‘ 8 0 0 -5 5 5 - 1 2 1 1 ’
5 );
INSERT INTO c u s tom e r s (
*
ERROR a t l i n e 1: '
0 R A -0 0 0 0 1 : u n iq u e c o n s t r a i n t (STORE.CUST0MERS_PK) v i o l a t e d
(Ошибка в с тр о к е 1:
0 R A -0 0 0 0 1 : нарушено ограничение по уник ально с ти (STORE.CUST0MERS_PK))
Если попытаться изменить значение первичного ключа на значение,
уже присутствующее в таблице, база данных также выдаст то же самое сообщение
об ошибке:
□ SQL> UPDATE c u s tom e r s
2 SET c u s tom e r _ id = 1
3 WHERE c u s tom e r _ id = 2;
UPDATE c u s tom e r s
★
ERROR a t l i n e 1:
0 R A -0 0 0 0 1 : u n iq u e c o n s t r a i n t (STORE.CUST0MERS_PK) v i o l a t e d
(Ошибка в с тр о к е 1:
0R A -0 0 0 0 1 : нарушено ограничение по уник ально с ти (STORE.CUST0MERS_PK))
Принудительное применение ограничений внешнего ключа
Отношение внешнего ключа имеет место, когда столбец одной таблицы
ссылается на столбец другой. Столбец p r o d u c t _ t y p e _ id таблицы p r o d u c t s
ссылается на столбец p r o d u c t _ t y p e _ id таблицы p r o d u c t _ t y p e s , используя
отношение внешнего ключа. Таблицу p r o d u c t _ t y p e s принято называть родительской
таблицей, а таблицу p r o d u c t s - дочерней (или подчиненной)
таблицей, поскольку столбец p r o d u c t _ t y p e _ id таблицы p r o d u c t s зависит от
столбца p r o d u c t _ t y p e _ id таблицы p r o d u c t _ t y p e s .
Если попытаться вставить в таблицу p r o d u c t s строку с несуществующим
p r o d u c t _ t y p e _ id , база данных выдаст сообщение об ошибке O R A - 0 2 2 9 1 . Эта
ошибка указывает на то, что база данных не в состоянии найти совпадающее
значение родительского ключа (это столбец p r o d u c t _ t y p e _ id таблицы
268 Гпава 8
p r o d u c t _ t y p e s ) . В следующем примере выдана ошибка, поскольку в таблице
p r o d u c t _ t y p e s нет строки с p r o d u c t _ t y p e _ id , равным 6: