Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
db_lectures / 06. Изменение таблиц. Ограничения целостности.docx
Скачиваний:
37
Добавлен:
21.05.2015
Размер:
23.27 Кб
Скачать

Ограничения целостности Первичные ключи

Технически, ограничение первичного ключа просто является комбинацией ограничений уникальности и не-null. Таким образом, следующие определения двух таблиц, позволяют вводить одинаковые данные:

CREATE TABLE products (

product_no integer UNIQUE NOT NULL,

name text,

price numeric

);

CREATE TABLE products (

product_no integer PRIMARY KEY,

name text,

price numeric

);

Первичные ключи также могут ограничивать более чем одну колонку; синтаксис сходен с ограничением уникальности:

CREATE TABLE example (

a integer,

b integer,

c integer,

PRIMARYKEY(a,c)

);

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

Таблица может иметь только один первичный ключ. Теория реляционных баз данных требует наличия первичного ключа для каждой таблицы. PostgreSQL не заставляет выполнять это правило, но лучше всего следовать ему.

Внешние ключи

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

Например, пусть у нас есть таблица товаров product. Пусть у нас есть таблица orders, хранящая порядок этих товаров. Мы хотим иметь уверенность, что таблица с порядком товаров содержит только те товары, которые уже есть. Для этого мы определяем ограничение внешнего ключа в таблице orders, которое ссылается на таблицу products:

CREATE TABLE orders (

order_id integer PRIMARY KEY,

product_no integer REFERENCES products (product_no),

quantity integer

);

Теперь в таблице orders невозможно создать строку, в которой значение product_no не соответствует одному из значений в таблице products.

Мы говорим, что в данной ситуации, таблица orders является ссылающейся(referencing) таблицей, а таблица products являетсяссылочной(referenced) таблицей. Похожим образом, колонки являются ссылающейся и ссылочной.

Можно записать данную выше команду в более кратком виде

CREATETABLEorders(

order_id integer PRIMARY KEY,

product_no integer REFERENCES products,

quantity integer

);

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

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

CREATE TABLE t1 (

a integer PRIMARY KEY,

b integer,

c integer,

FOREIGN KEY (b, c) REFERENCES other_table (c1, c2)

);

Разумеется, количество и тип ограничиваемых колонок должны совпадать с количеством и типом ссылочных колонок.

Своё собственное имя для ограничения внешнего ключа вы можете назначить обычным способом.

Таблица может содержать более одного ограничения внешнего ключа. Это используется при реализации между таблицами отношений многие-ко-многим.

Заметим, что первичный ключ может пересекаться со внешним ключом.