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

□ SQL> INSERT INTO products (

2 product_id, product_types_id, name, description, price

3 ) VALUES (

4 13, 6, ‘Test’, 'Test', NULL

5 );

INSERT INTO products (

*

E r r o r a t l i n e 1:

0R A -0 2 2 9 1 : i n t e g r i t y c o n s t r a i n t (STORE.PRODUCTS_FK_PRODUCT_TYPES)

v i o l a t e d - p a r e n t key n o t found

(Ошибка в с тр о к е 1:

0 R A -0 2 2 9 1 : нарушено ограничение по целос тнос ти

(STORE.PRODUCTS_FK_PRODUCT_TYPES) - не найден родительский ключ)

Если попытаться установить p r o d u c t _ t y p e _ id строки таблицы products

на несуществующее значение родительского ключа, база данных выдаст

сообщение об ошибке:

□ SQL> UPDATE p r o d u c t s

2 SET p r o d u c t _ t y p e _ id = 6

3 WHERE p r o d u c t _ id = 1;

UPDATE p r o d u c t s

*

ERROR a t l i n e 1:

0R A -0 2 2 9 1 : i n t e g r i t y c o n s t r a i n t (STORE.PRODUCTS_FK_PRODUCT_TYPES)

v i o l a t e d - p a r e n t key n o t found

(Ошибка в с тр о к е 1:

0R A -0 2 2 9 1 : нарушено ограничение по целос тнос ти

(STORE.PRODUCTS_FK_PRODUCT_TYPES) - не найден родительский ключ)

Если попытаться удалить из родительской таблицы строку, для которой

имеются зависящие от нее дочерние строки, база данных выдаст сообщение

об ошибке ORA02292. Например, если попытаться удалить из таблицы

p r o d u c t _ t y p e s строку с p r o d u c t _ t y p e _ id , равным 1 , база данных выдаст сообщение

об ошибке ORA-02292, поскольку в таблице products содержатся

строки со значениями p r o d u c t _ t y p e _ id , равными 1 :

□ SQL> DELETE FROM p r o d u c t _ t y p e s

2 WHERE p r o d u c t _ t y p e _ id = 1;

DELETE FROM p r o d u c t „ t y p e s

* ERROR a t l i n e 1:

0 R A -0 2 2 9 1 : i n t e g r i t y c o n s t r a i n t (STORE.PRODUCTS_FK_PRODUCT_TYPES)

v i o l a t e d - c h i l d r e c o rd key found

(Ошибка в с тр о к е 1:

ORA-0 2 2 91 : нарушено ограничение по целос тнос ти

(STORE.PRODUCTS_FK_PRODUCT_TYPES) - найдена дочерняя за п и с ь )

Если бы база данных позволила такое удаление, дочерние строки перестали

бы быть действительными, так как они больше не указывали бы на

подходящие значения в родительской таблице.

Изменение содержимого таблиц 269

Использование значений по умолчанию

В Oracle9i появилась новая возможность, позволяющая определять для

столбцов значения по умолчанию. Следующий оператор создает таблицу

по имени o r d e r _ s t a t u s , в которой есть два столбца - s t a t u s и l a s t j n o d i f i e d .

По умолчанию столбцу status назначается значение Order placed (заказ

размещен), а столбец l a s t _ m o d i f i e d по умолчанию принимает значение,

возвращаемое функцией SYSDATE:

□ CREATE TABLE o r d e r _ s t a t u s (

o r d e r _ s t a t u s _ i d INTEGER

CONSTRAINT d e f a u l t _ e x am p le _ p k PRIMARY KEY,

s t a t u s VARCHAR2(20) DEFAULT ‘ O rd e r p l a c e d ’ NOT NULL,

l a s t j n o d i f i e d DATE DEFAULT SYSDATE

);

Примечание Таблица order_status создается сценарием store_schema.sql. Это означает, что

не требуется вручную вводить данные в оператор CREATE и выполнять его самостоятельно, а

также не нужно вводить данные в операторы INSERT, приводимые далее в этом разделе.

Если нужно добавить новую строку в таблицу о r d e r _ s t a t u s , но при этом

не указывать значения для столбцов s t a t u s и l a s t _ m o d i f ie d , значения этих

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

операторе INSERT пропущены значения столбцов s t a t u s и l a s t _

m o d i f ie d :

□ INSERT INTO o r d e r _ s t a t u s ( o r d e r _ s t a t u s _ i d )

VALUES (1) ;

По умолчанию столбцу status будет присвоено значение Order placed, а

столбцу la s t _ m o d i f ie d - значение даты и времени, возвращенное функцией

SYSDATE.

Значения по умолчанию можно перекрыть, если явно определить значения

для этих столбцов:

□ INSERT INTO o r d e r _ s t a t u s ( o r d e r _ s t a t u s _ id , - s t a t u s , l a s t j n o d i a f i e d )

VALUES (2, ‘ O rd e r s h ip p e d ’ , ‘ 1 0 - JU N -2 0 0 4 ’ );

Следующий запрос выбирает строки из таблицы order_status:

□ SELECT *

FROM order_status;

ORDER_STATUS_ID STATUS LASTJ IODI

1 Ord e r p la c e d 2 5 - JU L -0 7

2 Ord e r s h ip p e d 1 0 - JUN-04

Можно обновить столбец, вернув его значение к значению по умолчанию,

если в операторе UPDATE использовать ключевое слово DEFAULT. Следующий

оператор DEFAULT восстанавливает значение столбца status по умолчанию:

270 Глава 8

UPDATE o r d e r _ s t a t u s

SET s t a t u s = DEFAULT

WHERE o r d e r _ s t a t u s _ i d = 2;

Следующий запрос показывает изменения, внесенные этим оператором

UPDATE:

SELECT *

FROM order_status;

ORDER_STATUS_ID STATUS LAST_M0DI

1 O rd e r p la c e d 2 5 - JU L -0 7

2 O rd e r p la c e d 10 - JUN-0 4

Слияние строк с использованием MERGE

В базе данных Oracle9i появился новый оператор MERGE, позволяющий вливать

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

влить изменения в товарах, хранящиеся в некоторой таблице,

в таблицу products.

В схеме store содержится таблица products_changes, которая была создана

с использованием следующего оператора CREATE TABLE сценария store_