Выбрать главу

□ 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: