Язык определения данных, страница 2

SQL> CREATE TABLE sample

  2  (first NUMBER, second NUMBER,

  3  CONSTRAINT sample_first_second_uk UNIQUE (first, second));

Table created.

Ограничение NOT NULL

столбец тип_данных [CONSTRAINT имя_ограничения] NOT NULL

§  Запрещает неопределенные значения в столбце

§  Ограничение может быть задано на уровне столбца

SQL> CREATE TABLE sample

  2  (first NUMBER CONSTRAINT sample_first_nn NOT NULL);

Table created.

Ограничение UNIQUE

столбец тип_данных [CONSTRAINT имя_ограничения] UNIQUE

§  Определяет один или более столбцов, как уникальный ключ

§  Ограничение может быть задано на уровне столбца и на уровне таблицы

§  Для уникального ключа автоматически создается индекс

§  Допускает неопределенные значения

SQL> CREATE TABLE sample

  2  (first NUMBER CONSTRAINT sample_first_uk UNIQUE,

  3  second NUMBER);

Table created.

SQL> INSERT INTO sample VALUES (1, 2);

1 row created.

SQL> INSERT INTO sample VALUES (1, 3);

INSERT INTO sample VALUES (1, 3)

*

ERROR at line 1:

ORA-00001: unique constraint (SYSTEM.SAMPLE_FIRST_UK) violated

Ограничение PRIMARY KEY

столбец тип_данных [CONSTRAINT имя_ограничения] PRIMARY KEY

§  Создает первичный ключ таблицы. Первичный ключ в таблице может быть только один.

§  Может быть задан на уровне столбца и на уровне таблицы

§  Для первичного ключа автоматически создается индекс

§  Гарантирует отсутствие неопределенных значений в столбцах и уникальность значений

SQL> CREATE TABLE sample

  2  (first NUMBER CONSTRAINT sample_first_pk PRIMARY KEY,

  3  second NUMBER);

Table created.

SQL> INSERT INTO sample VALUES (1, 2);

1 row created.

Если Вы попытаетесь вставить строку, в которой опущено значение для столбца первичного ключа или значение повторяется, сервер Oracle вернет ошибку:

SQL> INSERT INTO sample (second) VALUES (2);

INSERT INTO sample (second) VALUES (2)

            *

ERROR at line 1:

ORA-01400: cannot insert NULL into ("SYSTEM"."SAMPLE"."FIRST")

SQL> INSERT INTO sample VALUES (1, 5);

INSERT INTO sample VALUES (1, 5)

*

ERROR at line 1:

ORA-00001: unique constraint (SYSTEM.SAMPLE_FIRST_PK) violated

Ограничение FOREIGN KEY

столбец тип_данных [CONSTRAINT имя_ограничения] REFERENCES имя_таблицы (столбец, …)

§  Задает один или более столбцов в качестве внешнего ключа

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

§  Может быть задан на уровне столбца или уровне таблицы

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

SQL> SELECT * FROM sample;

    FIRST    SECOND

--------- ---------

        1         2

        3

SQL> CREATE TABLE sample_ref

  2  (first NUMBER CONSTRAINT sample_ref_first_fk REFERENCES sample (first),

  3  name VARCHAR2(20));

Table created.

SQL> INSERT INTO sample_ref VALUES (1, 'First name');

1 row created.

Вставка строки, значение внешнего ключа в которой не задано, допускается, если внешний ключ не является частью первичного ключа:

SQL> INSERT INTO sample_ref (name) VALUES ('Second name');

1 row created.

Если Вы попытаетесь вставить строку, значение внешнего ключа в которой задано, но не совпадает ни с одним значением первичного ключа в родительской таблице, сервер Oracle вернет ошибку:

SQL> INSERT INTO sample_ref VALUES (4, 'Fourth name');

INSERT INTO sample_ref VALUES (4, 'Fourth name')

*

ERROR at line 1:

ORA-02291: integrity constraint (SYSTEM.SAMPLE_REF_FIRST_FK) violated - parent key not found

По умолчанию строка родительской таблицы не может быть удалена, если в дочерней таблице присутствует ссылка на нее:

SQL> SELECT * FROM sample;

    FIRST    SECOND

--------- ---------

        1         2

        3

SQL> SELECT * FROM sample_ref;

    FIRST NAME

--------- --------------------

        1 First name

        3 Third name

SQL> DELETE FROM sample WHERE first=1;

DELETE FROM sample WHERE first=1

*

ERROR at line 1:

ORA-02292: integrity constraint (SYSTEM.SAMPLE_REF_FIRST_FK) violated - child record found

Задайте параметр ON DELETE CASCADE при добавлении ограничения внешней ссылки. В этом случае при удалении строки родительской таблицы зависимые строки тоже будут удалены.

столбец тип_данных [CONSTRAINT имя_ограничения]

REFERENCES имя_таблицы (столбец, …) ON DELETE CASCADE

Ограничение CHECK

столбец тип_данных [CONSTRAINT имя_ограничения] CHECK (условие)

§  Определяет условие, которому должна удовлетворять каждая строка

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

§  ссылок на псевдостолбцы

§  вызовов функций SYSDATE, USER

§  запросов со ссылками на значения в других строках

§  Может быть задано на уровне столбца или на уровне таблицы

SQL> CREATE TABLE sample

  2  (first NUMBER CONSTRAINT sample_first_ck CHECK (first>1000));

Table created.

SQL> INSERT INTO sample VALUES (1500);

1 row created.

SQL> INSERT INTO sample VALUES (900);

INSERT INTO sample VALUES (900)

*

ERROR at line 1:

ORA-02290: check constraint (SYSTEM.SAMPLE_FIRST_CK) violated

Создание таблицы на основе табличной модели

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

СОТРУДНИК