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

Ограничения не-Null

Ограничение не-null просто говорит, что колонка не должна содержать значение null. Пример синтаксиса:

CREATE TABLE products (

product_no integer NOT NULL,

name text NOT NULL,

price numeric

);

Ограничение не-null всегда записывается как ограничение на колонку. Ограничение не-null функционально эквивалентно созданию ограничения CHECK (column_name IS NOT NULL), но в PostgreSQL создание явного ограничения не-null является более эффективным.

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

CREATE TABLE products (

product_no integer NOT NULL,

name text NOT NULL,

price numeric NOT NULL CHECK (price > 0)

);

Ограничения уникальности

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

CREATE TABLE products (

product_no integer UNIQUE,

name text,

price numeric

);

для случая, когда это ограничение записывается на колонку и

CREATE TABLE products (

product_no integer,

name text,

price numeric,

UNIQUE (product_no)

);

когда это ограничение записывается на таблицу.

Если ограничение уникальности ссылается на группу колонок, эти колонки перечисляются через запятую:

CREATE TABLE example (

a integer,

b integer,

c integer,

UNIQUE (a, c)

);

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

Ограничение уникальности нарушается, когда в таблице есть более, чем одна строка, с одинаковыми значениями колонок, включённых в это ограничение. Однако, два значения null при сравнении не признаются равными друг другу. Это означает, что даже если значения null есть в самом ограничении уникальности, можно хранить дублирующиеся строки, которые содержат значения null по крайней мере в одной из колонок, которая указывается в ограничении. Такое поведение соответствует стандарту SQL, но мы имеет сведения, что другие SQL СУБД могут не следовать этому правилу. Так что будьте осторожны, когда разрабатываете приложения, которые задумываются как переносимые.

Именованные ограничения

Вы можете дать ограничению конкретное имя. Это сделает более понятными сообщения об ошибках и позволит вам ссылаться на это ограничение, когда вам понадобится его изменить. Синтакис такой:

CREATE TABLE products (

product_no integer,

name text,

price numeric CONSTRAINT positive_price CHECK (price > 0)

);

Таким образом, для создания именованого ограничения, используйте ключевое слово CONSTRAINT, за которым следует индентификатор (имя), после которого следует, собственно, определение ограничения. (Если при использовании этого синтаксиса вы не укажете имя ограничения, СУБД выберет имя за вас.)

Имена ограничениям на таблицу можно назначать таким же образом, как и ограничениям на колонки:

CREATE TABLE products (

product_no integer,

name text,

price numeric,

CHECK (price > 0),

discounted_price numeric,

CHECK (discounted_price > 0),

CONSTRAINT valid_discount CHECK (price > discounted_price)

);

Недостатком является то, что вы не можете явно задавать имена ограничениям не-null, которые созданны этим способом - если нужно, использовать CHECK.

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

CREATE TABLE products (

product_no integer CONSTRAINT must_be_different UNIQUE,

name text,

price numeric

);