Предложение CONSTRAINT (Microsoft Access SQL)

Область применения: Access 2013, Office 2013

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

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

Примечание.

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

Синтаксис

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

ИМЯ ОГРАНИЧЕНИЯ {PRIMARY KEY | UNIQUE | NOT NULL | REFERENCES foreigntable [(foreignfield1, foreignfield2)] [ON UPDATE CASCADE | SET NULL] [ON DELETE CASCADE | SET NULL]}

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

CONSTRAINT name {PRIMARY KEY (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 состоит из следующих частей:

Часть

Описание

name

Имя ограничения, которое необходимо создать.

primary1, primary2

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

unique1, unique2

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

notnull1, notnull2

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

ref1, ref2

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

foreigntable

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

foreignfield1, foreignfield2

Имя поля или полей в foreigntable, определяемых ref1, ref2. Это предложение можно опустить, если поле, на которое ссылаются, представляет собой первичный ключ foreigntable.

Комментарии

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

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

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

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

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

    Примечание.

    Не используйте ограничение PRIMARY KEY в таблице, в которой уже есть первичный ключ; если вы сделаете это, возникнет ошибка.

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

  • Вы можете указать действия для выполнения для внешней таблицы с учетом соответствующего действия, выполняемого для первичного ключа в таблице, в котором содержится определение CONSTRAINT. Например, допустим, что у таблицы "Клиенты" следующее определение:

      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
    

    Предложение ON UPDATE SET NULL означает, что при обновлении идентификатора клиента (CustId) в таблице "Клиенты" для соответствующих значений внешнего ключа из таблицы "Заказы" будет автоматически установлено значение NULL. Предложение ON DELETE SET NULL означает, что при удалении клиента из таблицы "Клиенты" для всех соответствующих внешних ключей в таблице "Заказы" будет автоматически установлено значение 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