Предложение CONSTRAINT (Microsoft Access SQL)
Ограничение похоже на индекс, несмотря на то, что его можно также использовать для создания связи с другой таблицей.
Вы можете использовать предложение CONSTRAINT в операторах ALTER TABLE и CREATE TABLEдля создания или удаления ограничений. Существует два типа предложений CONSTRAINT: одно для создания ограничения на отдельное поле, а другое — для создания ограничения на несколько полей.
Ядро СУБД Access не поддерживает использование CONSTRAINT или любые инструкции DDL с базами данных, которые не являются базами данных Microsoft Access. Используйте вместо этого методы DAO Create.
Синтаксис
Ограничения одного поля
ИМЯ ОГРАНИЧЕНИЯ foreigntable [(foreignfield1, foreignfield2)] [ON UPDATE CASCADE | SET NULL] [ON DELETE CASCADE | SET NULL]>
Ограничения нескольких полей
CONSTRAINT name primary1[, primary2 [, . ]]]) | UNIQUE (unique1[, unique2 [, . ]]]) | NOT NULL (notnull1[, notnull2 [, . ]]) | FOREIGN KEY [NO INDEX] (ref1[, ref2 [, . ]]]) REFERENCES foreigntable [(foreignfield1 [, foreignfield2 [, . ]])] [ON UPDATE CASCADE | SET NULL] [ON DELETE CASCADE | SET NULL]>
Предложение CONSTRAINT состоит из следующих частей:
Имя ограничения, которое необходимо создать.
Имя поля или полей, которые будут являться первичным ключом.
Имя поля или полей, которые будут являться уникальным ключом.
Имя поля или полей, в которых допускаются только значения, отличные от Null.
Имя поля или полей внешнего ключа, который ссылается на поля в другой таблице.
Имя внешней таблицы, содержащей одно или несколько полей, заданных foreignfield.
Имя поля или полей в foreigntable, определяемых ref1, ref2. Это предложение можно опустить, если поле, на которое ссылаются, представляет собой первичный ключ foreigntable.
Комментарии
Используйте синтаксис для ограничения одного поля в предложении, определяющем поле, инструкции ALTER TABLE или CREATE TABLE непосредственно после спецификации типа данных поля.
Используйте данный синтаксис для ограничения нескольких полей в случае, когда вы используете зарезервированное слово CONSTRAINT за пределами определяющего поле предложения в операторе ALTER TABLE или CREATE TABLE.
С помощью CONSTRAINT можно назначить поле в качестве одного из следующих типов ограничений:
- Чтобы указать поле в качестве уникального ключа, можно использовать зарезервированное слово UNIQUE. Это значит, что две записи в таблице не могут иметь одно и то же значение в этом поле. Вы можете определить любое поле или поля как уникальные. Если ограничение для нескольких полей используется в качестве уникального ключа, объединенные значения всех полей в индексе должны быть уникальными, даже если несколько записей имеют одинаковое значение в одном из полей.
- С помощью зарезервированного слова PRIMARY KEY можно назначить одно поле или набор полей в таблице в качестве первичного ключа. Все значения в первичном ключе должны быть уникальными и не быть равными Null, а у таблицы может быть только один первичный ключ.
Примечание. Не используйте ограничение PRIMARY KEY в таблице, в которой уже есть первичный ключ; если вы сделаете это, возникнет ошибка.
CREATE TABLE Customers (CustId INTEGER PRIMARY KEY, CLstNm NCHAR VARYING (50))
Рассмотрим следующее определение таблицы «Заказы», которое определяет отношение внешнего ключа, ссылающегося на первичный ключ таблицы «Клиенты»:
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 означает, что если в таблице «Клиенты» обновляется идентификатор клиента (CustId), будет выполняться каскадное обновление таблицы «Заказы». Каждый заказ, содержащий соответствующее значение идентификатора клиента, будет автоматически обновляться новым значением. Предложение ON DELETE CASCADE означает, что если клиент удаляется из таблицы «Клиенты», все строки в таблице «Заказы», содержащие то же значение идентификатора клиента, также будут удалены. Рассмотрим другое определение таблицы «Заказы», в котором вместо действия 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
Чтобы предотвратить автоматическое создание индексов для внешних ключей, можно использовать модификатор NO INDEX. Данная форма определения внешнего ключа должна применяться только в случаях, где получаемые в результате значения индекса часто будут дублироваться. Если значения в индексе внешнего ключа часто дублируются, использование индекса может быть менее эффективным, чем простое выполнение сканирования таблицы. Использование данного типа индекса со строками, вставляемыми и удаляемыми из таблицы, ухудшает производительность и не дает никаких преимуществ.
Пример
В этом примере создается новая таблица с именем ThisTable и двумя текстовыми полями.
Sub CreateTableX1() Dim dbs As Database ' Modify this line to include the path to Northwind ' on your computer. Set dbs = OpenDatabase("Northwind.mdb") ' Create a table with two text fields. dbs.Execute "CREATE TABLE ThisTable " _ & "(FirstName CHAR, LastName CHAR);" dbs.Close End Sub
В этом примере создается новая таблица с именем MyTable с двумя текстовыми поля, полем даты и времени и уникальным индексом, состоящим из всех трех полей.
Sub CreateTableX2() Dim dbs As Database ' Modify this line to include the path to Northwind ' on your computer. Set dbs = OpenDatabase("Northwind.mdb") ' Create a table with three fields and a unique ' index made up of all three fields. dbs.Execute "CREATE TABLE MyTable " _ & "(FirstName CHAR, LastName CHAR, " _ & "DateOfBirth DATETIME, " _ & "CONSTRAINT MyTableConstraint UNIQUE " _ & "(FirstName, LastName, DateOfBirth));" dbs.Close End Sub
В этом примере создается новая таблица с двумя текстовыми полями и полем Integer. Поле SSN является первичным ключом.
Sub CreateTableX3() Dim dbs As Database ' Modify this line to include the path to Northwind ' on your computer. Set dbs = OpenDatabase("Northwind.mdb") ' Create a table with three fields and a primary ' key. dbs.Execute "CREATE TABLE NewTable " _ & "(FirstName CHAR, LastName CHAR, " _ & "SSN INTEGER CONSTRAINT MyFieldConstraint " _ & "PRIMARY KEY);" dbs.Close End Sub
SQL Constraints
SQL constraints are used to specify rules for data in a table.
SQL Create Constraints
Constraints can be specified when the table is created with the CREATE TABLE statement, or after the table is created with the ALTER TABLE statement.
Syntax
CREATE TABLE table_name (
column1 datatype constraint,
column2 datatype constraint,
column3 datatype constraint,
.
);
SQL Constraints
SQL constraints are used to specify rules for the data in a table.
Constraints are used to limit the type of data that can go into a table. This ensures the accuracy and reliability of the data in the table. If there is any violation between the constraint and the data action, the action is aborted.
Constraints can be column level or table level. Column level constraints apply to a column, and table level constraints apply to the whole table.
The following constraints are commonly used in SQL:
- NOT NULL — Ensures that a column cannot have a NULL value
- UNIQUE — Ensures that all values in a column are different
- PRIMARY KEY — A combination of a NOT NULL and UNIQUE . Uniquely identifies each row in a table
- FOREIGN KEY — Prevents actions that would destroy links between tables
- CHECK — Ensures that the values in a column satisfies a specific condition
- DEFAULT — Sets a default value for a column if no value is specified
- CREATE INDEX — Used to create and retrieve data from the database very quickly
ограничение ссылочной целостности
Ограничение целостности ссылок в модели данных сущностей (EDM) аналогично ограничению целостности ссылок в реляционной базе данных. Точно так же, как столбец (или столбцы) из таблицы базы данных может ссылаться на первичный ключ другой таблицы, свойство (или свойства) типа сущности может ссылаться на ключ сущности другого типа сущности. Тип сущности, на который ссылается ссылка, называется основным концом ограничения. Тип сущности, ссылающийся на основной конец, называется зависимым концом ограничения.
Ограничение ссылочной целостности определяется как часть связи между двумя типами сущностей. Определение ограничения ссылочной целостности включает следующую информацию.
- Основной конец ограничения. (Тип сущности, ключ сущности которого имеет ссылку на зависимый конец.)
- Ключ сущности основного конца.
- Зависимый конец ограничения. (Тип сущности, который имеет свойство или свойства, ссылающиеся на ключ сущности основного конца.)
- Ссылка на свойство или свойства зависимого конца.
Целью ограничения ссылочной целостности в модели EDM является обеспечение постоянного существования допустимых ассоциаций. Дополнительные сведения см. в разделе Свойство внешнего ключа.
Пример
На приведенной ниже схеме показана концептуальная модель с двумя ассоциациями: WrittenBy и PublishedBy . Тип сущности Book имеет свойство PublisherId , которое ссылается на ключ сущности типа сущности Publisher при определении ограничения ссылочной целостности ассоциации PublishedBy .
В ADO.NET Entity Framework для определения концептуальных моделей используется язык DSL, называемый языком определения концептуальной схемы (CSDL). Далее на языке CSDL определяется ограничение ссылочной целостности для ассоциации PublishedBy , которая ранее приводилась в концептуальной модели.
См. также раздел
- Основные понятия модели EDM
- EDM (модель данных с использованием сущностей)
Предложение CONSTRAINT
Таблицы ограничение аналогичны индекс, однако их также можно использовать для создания связи отношение другой таблицей.
Предложение 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 имя
первичный_ключ1[, первичный_ключ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 включает в себя следующие элементы:
Имя создаваемого ограничения.
первичный_ключ1, первичный_ключ2
Имена полей, определяемых как первичный ключ.
уникальный_ключ1, уникальный_ключ2
Имена полей, определяемых как уникальный ключ.
непустое1, непустое2
Имена полей, в которых не может быть значений NULL.
ссылка1, ссылка2
Имя поля или полей внешнего ключа, которые ссылаются на поля в другой таблице.
внешняя_таблица
Имя поля внешняя таблица которое содержит поле или поля, заданные полем внешнего поля.
внешнее_поле1, внешнее_поле2
Имена полей во внешней_таблице, заданных аргументами ссылка1, ссылка2. Если ссылка указывает на поле первичного ключа внешней_таблицы, данный аргумент можно опустить.
Замечания
Выражение для ограничения на одно поле указывается в предложении определения поля инструкции ALTER TABLE или CREATE TABLE непосредственно за спецификацией типа данных поля.
Выражение для ограничения на несколько полей указывается тогда, когда зарезервированное слово CONSTRAINT используется вне предложения определения поля в инструкции ALTER TABLE или CREATE TABLE.
В предложении CONSTRAINT можно задать для поля один из следующих типов ограничений:
- Зарезервированное слово UNIQUE используется для назначения поля в качестве уникального ключа. Это значит, что две записи в таблице не могут иметь одно и то же значение в этом поле. Любое поле (или список полей) можно ограничить как уникальное. Если ограничение на несколько полей назначено уникальным ключом, объединенные значения всех полей в индексе должны быть уникальными, даже если несколько записей имеют одинаковое значение в одном из полей.
- Зарезервированные слова PRIMARY KEY используются для назначения одного поля или совокупности полей таблицы в качестве первичного ключа. Все значения в первичном ключе должны быть уникальными и отличными от NULL, причем в таблице может быть только один первичный ключ.
Примечание: Ограничение PRIMARY KEY не следует устанавливать в таблице, уже имеющей первичный ключ: это приведет к ошибке.
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. Определение внешнего ключа в такой форме должно применяться только в том случае, если получающиеся в результате значения индексов будут часто повторяться. Если значения в индексе внешнего ключа часто повторяются, использование индекса может быть менее эффективно, чем простое сканирование таблицы. Сохранение такого индекса при вставке и удалении строк таблицы снижает производительность и не приносит никакой пользы.