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

Предложение CONSTRAINT используется в инструкциях ALTER TABLE и CREATE TABLE для создания и удаления ограничений. Существует два типа предложений CONSTRAINT: для создания ограничения на одно поле и на несколько полей.

Примечание: Ядро СУБД Microsoft Access не поддерживает использование CONSTRAINT или любых других инструкций DDL с базами данных, которые не основаны на Microsoft Access. Вместо этого применяйте методы Create DAO.

Синтаксис

Ограничение на одно поле:

CONSTRAINT имя REFERENCES внешня я_таблица [( внешнее_поле1, внешнее_поле2)]
[ON UPDATE CASCADE | SET NULL]
[ON DELETE CASCADE | SET NULL]>

Ограничение на несколько полей:

CONSTRAINT имя[, первичный_ключ2 [, . ]]) |
UNIQUE ( уникальный_ключ1[, уникальный_ключ2 [, . ]]) |
NOT NULL ( непустое1[, непусто е2 [, . ]]) |
FOREIGN KEY [NO INDEX] ( ссылка1[, ссылка2 [, . ]]) REFERENCES внешняя_таблица [( внешнее_поле1 [, внешнее_поле2 [, . ]])]
[ON UPDATE CASCADE | SET NULL]
[ON DELETE CASCADE | SET NULL]>

Предложение CONSTRAINT включает в себя следующие элементы:

Имя создаваемого ограничения.

Имена полей, определяемых как первичный ключ.

Имена полей, определяемых как уникальный ключ.

Имена полей, в которых не может быть значений NULL.

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

Имя внешней таблицы, содержащей поля, которые указаны в аргументе внешнее_поле.

Имена полей во внешней_таблице, заданных аргументами ссылка1, ссылка2. Если ссылка указывает на поле первичного ключа внешней_таблицы, данный аргумент можно опустить.

Замечания

Выражение для ограничения на одно поле указывается в предложении определения поля инструкции ALTER TABLE или CREATE TABLE непосредственно за спецификацией типа данных поля.

Выражение для ограничения на несколько полей указывается тогда, когда зарезервированное слово CONSTRAINT используется вне предложения определения поля в инструкции ALTER TABLE или CREATE TABLE.

В предложении CONSTRAINT можно задать для поля один из следующих типов ограничений:

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

Зарезервированные слова PRIMARY KEY используются для назначения одного поля или совокупности полей таблицы в качестве первичного ключа. Все значения в первичном ключе должны быть уникальными и отличными от NULL, причем в таблице может быть только один первичный ключ.

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

Зарезервированная фраза FOREIGN KEY используется для назначения поля в качестве внешнего ключа. Если первичный ключ внешней таблицы содержит больше одного поля, необходимо определить ограничение на несколько полей, указав все ссылающиеся поля, имя внешней таблицы и имена полей внешней таблицы, на которые указывают ссылки (в том же порядке, в котором перечислены ссылающиеся поля). Если поля, на которые указывают ссылки, являются первичным ключом внешней таблицы, указывать их не требуется. По умолчанию ядро СУБД считает, что ссылки указывают на первичный ключ внешней таблицы.

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

Можно задать действия, которые будут выполняться во внешней таблице, на основе действий, выполняемых в первичном ключе таблицы, для которой определено предложение CONSTRAINT. Пример определения для таблицы Customers:

CREATE TABLE Customers (CustId INTEGER PRIMARY KEY, CLstNm NCHAR VARYING (50))

Пример определения для таблицы Orders, в котором задается отношение внешнего ключа, ссылающееся на первичный ключ таблицы Customers:

CREATE TABLE Orders (OrderId INTEGER PRIMARY KEY, CustId INTEGER, OrderNotes NCHAR VARYING (255), CONSTRAINT FKOrdersCustId FOREIGN KEY (CustId) REFERENCES Customers ON UPDATE CASCADE ON DELETE CASCADE

Для внешнего ключа определены предложения ON UPDATE CASCADE и ON DELETE CASCADE. Предложение ON UPDATE CASCADE означает, что при обновлении в таблице Customers идентификатора клиента (CustId) будет выполнено каскадное обновление в таблице Orders. В каждый заказ, содержащий соответствующее значение идентификатора клиента, будет автоматически внесено новое значение. Предложение ON DELETE CASCADE означает, что при удалении клиента из таблицы Customers все строки таблицы Orders, содержащие его идентификатор, также будут удалены.

Другое определение для таблицы Orders, в котором вместо действия CASCADE используется SET NULL:

CREATE TABLE Orders (OrderId INTEGER PRIMARY KEY, CustId INTEGER, OrderNotes NCHAR VARYING (255), CONSTRAINT FKOrdersCustId FOREIGN KEY (CustId) REFERENCES Customers ON UPDATE SET NULL ON DELETE SET NULL

Предложение ON UPDATE SET NULL означает, что при обновлении в таблице Customers идентификатора клиента (CustId) соответствующие значения внешнего ключа в таблице Orders автоматически изменятся на NULL. Аналогично предложение ON DELETE SET NULL означает, что при удалении клиента из таблицы Customers все соответствующие внешние ключи в таблице Orders принимают значение NULL.

Чтобы предотвратить автоматическое создание индексов для внешних ключей, можно использовать модификатор NO INDEX. Определение внешнего ключа в такой форме должно применяться только в том случае, если получающиеся в результате значения индексов будут часто повторяться. Если значения в индексе внешнего ключа часто повторяются, использование индекса может быть менее эффективно, чем простое сканирование таблицы. Сохранение такого индекса при вставке и удалении строк таблицы снижает производительность и не приносит никакой пользы.

Скрипт писал не я, и пытаюсь понять логику человека который это делал. В чем может быть смысл этого ограничения CONSTRAINT person_pkey PRIMARY KEY (id) ? И во втором случае аналогично. Это ограничение что id может быть только первичным ключем ? А зачем это может быть нужно? Тем более еще и именовать это ограничение. Помогите пожалуйста разобраться зачем делать такой CONSTRAINT ?

1 ответ 1

и означает, что id является первичным ключом таблицы.

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

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

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

CONSTRAINT constraint_name
An optional name for a column or table constraint. If the constraint is violated, the constraint name is present in error messages, so constraint names like col must be positive can be used to communicate helpful constraint information to client applications. (Double-quotes are needed to specify constraint names that contain spaces.) If a constraint name is not specified, the system generates a name.

Вы путаете сладкое с мягким.
Constraint ограничение — когда вы задаёте параметры таблицы при помощи create/alter table
вы говорите, что для такого-то поля задаётся constraint (ограничение).
Ограничениями может быть primary key, foreign key, unique, default, check и т. д. — это всё ограничения.
Вот таблица:

Что переводится как:
Создать таблицу MYTABLE (с полями):
ID целое 64 бит, не допускать пустых, ограничение с названием PK_MYTABLE вида "Первичный ключ",
CLIENT целое 64 бит, не допускать пустых, ограничение с названием FK_MYTABLE_CLIENT вида "Внешний ключ", который ссылается на таблицу CLIENTS, поле ID,
EMAIL строковое длиной 100, не допускать пустых, ограничение с названием UQ_MYTABLE_EMAIL вида "Должно быть уникальным",
ACTIVE бит, не допускать пустых, органичение с названием DF_MYTABLE_ACTIVE вида "Значение по умолчанию" равное 1

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