Предложение 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
Что означает CONSTRAINT в данном контексте?
Скрипт писал не я, и пытаюсь понять логику человека который это делал. В чем может быть смысл этого ограничения CONSTRAINT person_pkey PRIMARY KEY (id) ? И во втором случае аналогично. Это ограничение что id может быть только первичным ключем ? А зачем это может быть нужно? Тем более еще и именовать это ограничение. Помогите пожалуйста разобраться зачем делать такой CONSTRAINT ?
Отслеживать
18.5k 4 4 золотых знака 31 31 серебряный знак 45 45 бронзовых знаков
задан 11 мая 2017 в 19:47
5,327 11 11 золотых знаков 58 58 серебряных знаков 117 117 бронзовых знаков
Для определения первичного ключа, т.е. нельзя будет добавить два одинаковых или неопределённых id. Или другими словами для уникальности энтити, ну типа был Пётр 1-й потом Пётр 3-й, два разных мужика.
11 мая 2017 в 19:55
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
CONSTRAINT company_pkey PRIMARY KEY (id)
PRIMARY KEY (id)
и означает, что id является первичным ключом таблицы.
Т.к. в данном случае первичный ключ состоит из одного столбца, то его можно было бы указать на уровне поля:
CREATE TABLE company( id integer PRIMARY KEY, name character varying );
Возможность определения ключа на уровне таблицы полезна если ключ — составной
PRIMARY KEY (id, name)
В первом случае у ограничения задано имя. Это имя будет выводиться в сообщениях об ошибках. Также по имени можно это ограничение удалить. В случае если имя ограничения не задано явно, оно будет сгенерировано СУБД.
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.
Оператор ALTER TABLE
Можно выделить следующие уровни проверочных ограничений:
- уровень атрибута (столбца),
- уровень кортежа (строки),
- уровень отношения (таблицы).
В ограничении уровня столбца проверяется значение только одного отдельного столбца, другими словами, в ограничении данного типа имеется ссылка только на один столбец той таблицы, в определении которой содержится данное ограничение. Чтобы привести пример такого ограничения, вернёмся к схеме «Компьютерная фирма». В таблице Product в столбце type может находиться одно из трех значений. Мы можем запретить ввод любой другой информации в этот столбец при помощи такого ограничения:
Давайте сделаем отступление, чтобы познакомиться с оператором ALTER TABLE , который позволит нам изменять структуру таблицы, не пересоздавая её всякий раз заново. Это тем более важно, что изменение структуры может потребоваться тогда, когда таблица уже содержит данные.
С помощью оператора ALTER TABLE можно добавить или удалить столбцы, значения по умолчанию, а также ограничения.
В настоящий момент нас интересует добавление ограничения на столбец type , поэтому вначале приведём синтаксис оператора для добавления ограничения:
Давайте теперь добавим наше ограничение и проверим, как оно работает.
Чтобы убедиться в том, что ограничение работает как мы того ожидаем, попробуем добавить модель нового типа:
Как и ожидалось, в ответ мы получим сообщение об ошибке:
The INSERT statement conflicted with the CHECK constraint «chk_type». The conflict occurred in database «learn», table «dbo.product», column ‘type’. The statement has been terminated.
(Конфликт инструкции INSERT с ограничением CHECK «chk_type». Конфликт произошел в базе данных «learn», таблица «dbo.product», столбец ‘type’. Выполнение данной инструкции было прервано.)
Как легко догадаться, ограничение уровня строки содержит ссылки на несколько столбцов. При этом ограничение проверяется для каждой изменяемой строки отдельно. Строка может быть добавлена (или изменена), если ограничение не нарушено.
В качестве примера давайте запретим производителю Z выпускать что-либо помимо принтеров.
Итак, ограничение проверяет, что модель в таблице Product должна быть принтером производителя Z (maker=’Z’ and type= ‘printer’) или любого другого производителя (но не Z).
Если мы попытаемся добавить модель ПК производителя Z,
то получим приведенное выше сообщение об ошибке, в котором вместо имени ограничения chk_type будет упомянуто ограничение chk_maker_Z. При этом модель принтера будет добавлена без проблем:
Разумеется, другой производитель сможет выпускать все, что угодно:
ALTER TABLE — изменение таблицы в SQL
Команда ALTER TABLE применяется в SQL при добавлении, удалении либо модификации колонки в существующей таблице. В этой статье будет рассмотрен синтаксис и примеры использования ALTER TABLE на примере MS SQL Server.
SQL-оператор ALTER TABLE способен менять определение таблицы несколькими способами: • добавлением/переопределением/удалением столбца (column); • модифицированием характеристик памяти; • включением, выключением либо удалением ограничения целостности.
При этом пользователю нужно обладать системной привилегией ALTER ANY TABLE либо таблица должна находиться в схеме пользователя.
Меняя типы данных существующих columns либо добавляя их в БД-таблицу, следует соблюдать некоторые условия. Принято, что увеличение есть хорошо, а уменьшение — не очень. Существует ряд допустимых увеличений: • добавляем новые столбцы в таблицу; • увеличиваем размер столбца CHAR либо VARCHAR2; • увеличиваем размер столбца NUMBER.
Нередко перед внесением изменений следует удостовериться, что в соответствующих columns все значения — это NULL-значения. Если выполняется операция над столбцами, которые содержат данные, следует найти либо создать область временного хранения данных. Можно создать таблицу посредством CREATE TABLE AS SELECT, где извлекаются данные из первичного ключа и изменяемых columns. Существует ряд допустимых изменений: • уменьшаем размер столбца NUMBER (лишь при наличии пустого column для всех строк); • уменьшаем размер столбца CHAR либо VARCHAR2 (лишь при наличии пустого column для всех строк); • меняем тип данных столбца (аналогично, что и в первых двух пунктах).
При добавлении column с ограничением NOT NULL, администратор баз данных либо разработчик обязан учесть некоторые обстоятельства. Вначале следует создать столбец без ограничения, потом ввести значения во все строки. Далее, когда значения column будут уже не NULL, к нему можно будет применить ограничение NOT NULL. Но если column с ограничением NOT NULL хочет добавить юзер, то вернётся сообщение об ошибке, судя по которому таблица должна быть либо пустой, либо содержать в столбце значения для каждой имеющейся строки (после наложения на column NOT NULL-ограничения, в нём не смогут присутствовать значения NULL ни в одной из имеющихся строк).
Синтаксис ALTER TABLE на примере MS SQL Server
Рассмотрим общий формальный синтаксис на примере SQL Server от Microsoft:
ALTER TABLE имя_таблицы [WITH CHECK | WITH NOCHECK]
Итак, используя SQL-оператор ALTER TABLE, мы сможем выполнить разные сценарии изменения таблицы. Далее будут рассмотрены некоторые из этих сценариев.
Добавляем новый столбец
Для примера добавим новый column Address в таблицу Customers:
ALTER TABLE Customers ADD Address NVARCHAR(50) NULL;В примере выше столбец Address имеет тип NVARCHAR, плюс для него определён NULL-атрибут. Если же в таблице уже существуют данные, команда ALTER TABLE не выполнится. Однако если надо добавить столбец, который не должен принимать NULL-значения, можно установить значение по умолчанию, используя атрибут DEFAULT:
ALTER TABLE Customers ADD Address NVARCHAR(50) NOT NULL DEFAULT 'Неизвестно';Тогда, если в таблице существуют данные, для них для column Address добавится значение "Неизвестно".
Удаляем столбец
Теперь можно удалить column Address:
ALTER TABLE Customers DROP COLUMN Address;Меняем тип
Продолжим манипуляции с таблицей Customers: теперь давайте поменяем тип данных столбца FirstName на NVARCHAR(200).
ALTER TABLE Customers ALTER COLUMN FirstName NVARCHAR(200);Добавляем ограничения CHECK
Если добавлять ограничения, SQL Server автоматически проверит существующие данные на предмет их соответствия добавляемым ограничениям. В случае несоответствия, они не добавятся. Давайте ограничим Age по возрасту.
ALTER TABLE Customers ADD CHECK (Age > 21);При наличии в таблице строк со значениями, которые не соответствуют ограничению, sql-команда не выполнится. Если надо избежать проверки и добавить ограничение всё равно, используют выражение WITH NOCHECK:
ALTER TABLE Customers WITH NOCHECK ADD CHECK (Age > 21);По дефолту применяется значение WITH CHECK, проверяющее на соответствие ограничениям.
Добавляем внешний ключ
Представим, что изначально в базу данных будут добавлены 2 таблицы, которые между собой не связаны:
Теперь добавим к столбцу CustomerId ограничение внешнего ключа (таблица Orders):
ALTER TABLE Orders ADD FOREIGN KEY(CustomerId) REFERENCES Customers(Id);Добавляем первичный ключ
Применяя определенную выше таблицу Orders, можно добавить к ней для столбца Id первичный ключ:
ALTER TABLE Orders ADD PRIMARY KEY (Id);Добавляем ограничения с именами
Добавляя ограничения, можно указать имя для них — для этого пригодится оператор CONSTRAINT (имя прописывается после него):
Удаляем ограничения
Чтобы удалить ограничения, следует знать их имя. Если с этим проблема, имя всегда можно определить с помощью SQL Server Management Studio:
Следует раскрыть в подузле Keys узел таблиц, где находятся названия ограничений для внешних ключей (названия начинаются с «FK»). Обнаружить все ограничения DEFAULT (названия начинаются с «DF») и CHECK («СК») можно в подузле Constraints.
Из скриншота видно, что в данной ситуации имя ограничения внешнего ключа (таблица Orders) имеет название "FK_Orders_To_Customers". Здесь для удаления внешнего подойдёт такое выражение:
ALTER TABLE Orders DROP FK_Orders_To_Customers;Хотите знать про SQL Server больше? Добро пожаловать на курс "MS SQL Server Developer" в OTUS! Также вас может заинтересовать общий курс по работе с реляционными и нереляционными БД:


