Изменение таблиц. Добавление строки. Копирование строк из таблицы. Команда UPDATE, страница 3

(pub_id              CHAR(3)                NOT NULL,

pub_name          VARCHAR(20)    NOT NULL,

city                     VARCHAR(15)    NOT NULL,

state                   CHAR(3)               NULL,

country              VARCHAR(15)    NOT NULL,

CONSRAINT publisher_pk PRIMERY KEY (pub_id) );

Для задания сложного ключа следует перечислить список столбцов, образующих ключ.

CREATE TABLE title_authors

(title_id              CHAR(3)               NOT NULL,

au_id                CHAR(3)                NOT NULL,

au_order           SMALLINT           NOT NULL,

royalty_share    DECIMAL(5,2)     DEFAULT 1.0 NOT NULL);

CONSRAINT title_authors_pk PRIMERY KEY (title_id, au_id) );

Задание внешнего ключа

Внешний ключ применяется для связи таблиц, его значения связаны со значениями в другой таблице или ссылаются на них. Внешний ключ создает связь с первичным ключом (или группой значений) в родительской таблице, его значения должны соответствовать значениям в родительской таблице. Это свойство называется ссылочной целостностью. Внешний ключ может принимать значение NULL. В таблице может быть несколько внешних ключей либо не быть ни одного.

Внешний ключ задается предложением FOREING KEY или REFERENCES. Названия столбца внешнего ключа может не совпадать с родительским. Внешний ключ необязательно ссылается на столбец первичного ключа родительской таблицы. Он может ссылаться на столбец, содержащий уникальные значения. Если не задано ограничение на столбец внешнего ключа, будет задано ограничение NULL (можно задавать и ограничение NOT NULL).

Внешние ключи препятствуют некорректных операциям по удалению или изменению данных за счет контроля ссылочной целостности. СУБД препятствует созданию строк, не имеющих соответствия в родительской таблице. Выполняются следующие проверки во время исполнения команд INSERT, UPDATE, DELETE:

- при добавлении строки – наличие соответствия в родительской таблице значению внешнего ключа новой строки (при отсутствии соответствия строка не добавляется);

- при изменении – проверка соответствия нового значения внешнего ключа значению в родительской таблице (при отсутствии соответствия строка не изменяется);

- при удалении строки подчиненной таблицы проверка целостности не выполняется;

- при добавлении строки в родительскую таблицу проверка не выполняется;

- при изменении строки родительской таблицы – проверка соответствия нового значения родительской таблицы значению внешнего ключа (при наличии соответствия изменение не выполняется);

- при удалении строки родительской таблицы – проверка наличия в подчиненной таблицу внешнего ключа, соответствующего удаляемому значению (при наличии соответствия удаление не выполняется).

Внешний ключ можно задать несколькими способами.

1) CREATE TABLE title

(title_id              CHAR(3)                         NOT NULL PRIMARY KEY,

title_name         VARCHAR(40)              NOT NULL,

type                  VARCHAR(10)               NOT NULL,

pub_id              CHAR(3)                         NOT NULL REFERENCES publishers(pub_id),

pages                INTEGER                      NULL,

price                 DECIMAL(5,2)             NULL,

sales                 INTEGER                      NULL,

pubdate            DATE                           NULL,

contract            SMALLINT                  NOT NULL);

Установлена связь с таблицей publishers.

2) CREATE TABLE royalties

(title_id              CHAR(3)                         NOT NULL,

advance            DECIMAL(9,2)               NULL,

royalty_rate     DECIMAL(5,2)               NULL,

CONSRAINT royalties_pk PRIMARY KEY (title_id),

CONSRAINT royalties_ title_id_fk FOREING KEY (title_id) REFERENCES title(title_id)

);

Столбец title_id является и первичным и внешним ключом, связь установлен с таблицей title.