1.9.6 Итоги лекции
Усвоив материал этой лекции, студенты научились:
вставлять в таблицу базы данных отдельные строки, содержащие значе-
ния всех столбцов таблицы;
вставлять в таблицу базы данных отдельные строки, содержащие значе-
ния не всех столбцов таблицы;
изменятьпорядок перечисления значенийстолбцов во вставляемых строках;
использовать в качестве вставляемых значений выражения;
обновлять значения столбцов во всех строках таблицы;
обновлять значения столбцов в выборочных строках таблицы;
удалять все строки таблицы;
удалять выборочные строки таблицы.
1.10 Определение ограничений целостности, ключей, задание прав до-
ступа к данным (17-18)
1.10.1 Аннотация к лекции
Эта лекция посвящена ограничениям целостности - составной части опре-
деления таблицы. С их помощью можно ограничить допустимые значения столбцов, совокупности столбцов, всей таблицы в целом или значений между таблицами. СУБД будет запрещать вводить или обновлять любые значения столбцов таблицы, нарушающие заданные ограничения целостности.
1.10.2 Виды ограничений целостности
Ограничения целостности используются для описания и поддержки дей-
ствующих в предметной области ограничений на возможные значения данных.
После определения ограничения целостности все данные в таблице должны со-
ответствовать тем правилам, которые представлены в этом определении. При последующем выполнении команд SQL по модификации данных в таблице СУБД должна гарантировать, что результирующие данные удовлетворяют ука-
занным ограничениям. Без использования ограничений целостности соответ-
ствующие правила, действующие в предметной области, пришлось бы поддер-
живать с помощью программных средств вашего приложения.
Стандарт SQL допускает при определении таблиц базы данных специфи-
цировать ограничения целостности следующих типов:
[NOT] NULL – допускает или запрещает вставлять строки, которые содер-
жат в столбце неопределенные значения;
UNIQUE – разрешает вставлять в таблицу только такие строки, которые содержат уникальные значения столбца (столбцов);
PRIMARY KEY – ограничение первичного ключа указывает, что все стро-
ки таблицы уникально идентифицируются значениями столбца (столбцов); FOREIGN KEY – ограничение внешнего ключа (или ссылочное) устанав-
ливает, что значения столбца (столбцов) должны соответствовать значениям столбца (столбцов) другой таблицы;
CHECK – позволяет задавать для столбца (столбцов) сложные условия на значение, которые должны соблюдаться при манипулировании строками таб-
лицы.
Кроме того, стандарт SQL предоставляет возможность специфицировать самостоятельные, независимые от определения таблиц ограничения целостно-
сти, получившие название утверждений.
Ограничения целостности можно задавать для:
столбца – это ограничение, которое специфицируется относительно зна-
чений конкретного столбца и указывается после определения типа данных столбца (но перед запятой);
таблицы – это ограничение рассматривается как единое для группы столб-
цов и помещается в конец определения таблицы (после последнего имени столбца, но перед заключительной круглой скобкой).
Упрощенный вариант синтаксиса команды CREATE TABLE с указанием ограничений выглядит так:
CREATE TABLE имя_таблицы (
имя_столбца тип_данных ограничения_столбца[,
имя_столбца тип_данных ограничения_столбца]... [,
ограничение_таблицы]...);
Ограничение целостности как столбца, так и таблицы может предваряться фразой CONSTRAINT:
CONSTRAINT имя_ограничения
Она позволяет приписать ограничению имя, по которому в дальнейшем можно ссылаться на это ограничение, например, чтобы его удалить. Эта фраза не является обязательной.
1.10.3 Ограничение на отсутствие значения
Ограничение на отсутствие значения задается с помощью фразы NOT NULL и запрещает использовать в качестве значения столбца неопределенное значение, то есть специальное значение, которое использует СУБД для пред-
ставления неизвестного или неприменимого значения.
Вспомним, что NULL — это специальное обозначение, которое отмечает значение столбца как отсутствующее. Если указать фразу NOT NULL сразу по-
сле типа данных столбца, любая попытка поместить значение NULL в этот столбец будет отклонена. Синтаксис ограничения такой:
имя_столбца тип_данных [CONSTRAINT имя_ограничения] NOT NULL
Если фразы NOT NULL в определении столбца нет, SQL предполагает, что значение NULL разрешено (вы можете указать это явно путем задания ограни-
чения NULL).
Важно помнить, что для любого столбца с ограничением NOT NULL
должно быть установлено значение в каждом предложении INSERT или
UPDATE, применяемом к таблице.
При добавлении с помощью инструкции ALTER TABLE новых столбцов с ограничением NOT NULL к уже существующей таблице может возникнуть противоречие. Если к моменту добавления новых столбцов таблица не содер-
жала строк, проблемы не будет. Но если строки уже существуют, какое значе-
ние должна поместить СУБД в создаваемые столбцы? Ведь они, в соответствии с ограничением NOT NULL, должны содержать значение в каждой строке. Од-
но из возможных решений – определить для таких столбцов значение по умол-
чанию.
СОВЕТ. Обратитесь к документации конкретной СУБД, чтобы выяснить предоставляемые возможности решения. Например, в Oracle запрещено добав-
лять к таблице столбцы с ограничением NOT NULL, если таблица уже имеет строки.
Еще одна проблема возникает при добавлении ограничения NOT NULL
для уже существующего столбца (снова при помощи инструкции ALTER TABLE). Если в таблице уже имеются строки, этот столбец уже может содер-
жать значения NULL и тогда устанавливаемое ограничение NOT NULL входит в противоречие с текущими данными
Приведем пример использования ограничения NOT NULL для столбцов таблицы DEPARTMENT:
CREATE TABLE DEPARTMENT
(DepPK INTEGER,
FacFK INTEGER NOT NULL.,
Name VARCHAR(30) CONSTRAINT dep_nnl_nam NOT NULL,
Head VARCHARC20));
В первом случае ограничение NOT NULL задано без указания имени огра-
ничения, во втором – с именем.
1.10.4 Ограничение уникальности
Уникальность значения столбца – это ограничение, указывающее, что дан-
ный столбец (или группа столбцов) не может принимать одинаковых значений в пределах таблицы. В некоторых СУБД уникальность значений столбов под-
держивается с помощью создания уникальных индексов, в других она задается независимо от объявления индекса (хотя для того чтобы поддерживать уни-
кальность столбца, для него, как правило, автоматически создается индекс).
Столбец (совокупность столбцов), принимающий уникальные значения,
часто называют уникальным ключом. Если уникальным является один столбец,
он называется простым уникальным ключом, а если несколько – составным уникальным ключом.
Простой уникальный ключ может задаваться и как ограничение столбца, и
как ограничение таблицы. Составной уникальный ключ задается только как
ограничение таблицы. Для одной таблицы может быть определено несколько уникальных ключей.
Указание уникальности значений столбца имеет следующий синтаксис:
имя_столбца тип_данных [CONSTRAINT имя_ограничения] UNIQUE
В этом случае СУБД будет отклонять любую попытку ввода в этот столбец значения, которое уже существует в другой строке таблицы. Приведем пример определения уникальности как ограничения столбца:
CREATE TABLE FACULTY
(FacPK INTEGER,
Name VARCHAROO) NOT NULL
CONSTRAINT fac_unq_nam UNIQUE,
Dean VARCHAR(20) CONSTRAINT fac_unq_den UNIQUE,
Building CHAR(5),
Fund NUMBER(7, 2));
Обратите внимание, что столбец Name имеет два ограничения: NOT NULL
и UNIQUE. При необходимости определения для столбца нескольких ограни-
чений целостности они могут описываться в произвольном порядке.
Объявление группы столбцов как уникальной отличается от объявления уникальными одного или нескольких отдельных столбцов – для группы столб-
цов уникальной должна быть комбинация их значений, а не индивидуальные значения. Если определяется уникальность группы столбцов, каждый из столб-
цов этой группы уникальным может и не быть. Указание уникальности значе-
ний группы столбцов помещается после описания столбцов и имеет следующий синтаксис:
[CONSTRAINT имя_ограничения] UNIQUE (список_столбцов)
Рассмотрим следующий пример описания уникальности значения сово-
купности столбцов в таблице SGR0UP:
CREATE TABLE SGROUP
(GrpPK INTEGER,
DepFK INTEGER,
Num NUMBER(3) NOT NULL,
Year NUMBERC1) NOT NULL,
CONSTRAINT grp_unq_num_yar_dep UNIQUE (Num, Year, DepFK));
Заданное ограничение уникальности указывает, что на одной и той же ка-
федре (DepFK) не могут быть группы с одинаковыми номерами (Num) в преде-
лах одного курса (Year), однако сами номера групп, курсов и факультетов в пределах таблицы могут повторяться. Более того, могут повторяться комбина-
ции значений любых пар из этих трех столбцов.
1.10.5 Ограничение первичного ключа
Первичный ключ – это столбец (или совокупность столбцов) таблицы, ко-
торый уникально идентифицирует строку таблицы. Первичный ключ очень по-
хож на уникальный ключ – он тоже уникальный, может быть простым и со-
ставным, указываться как в описании столбца, так и для всей таблицы. Однако есть два существенных различия. Во-первых, уникальный ключ может прини-
мать значения NULL, первичный ключ – нет. Во-вторых, таблица может содер-
жать только один первичный ключ.
Простой первичный ключ
Синтаксис ограничения первичного ключа имеет следующий вид:
имя_столбца тип_данных [CONSTRAINT имя_ограничения] PRIMARY KEY
Вот как, например, выглядит определение первичного ключа в таблице
ROOM:
CREATE TABLE ROOM
(RomPK INTEGER CONSTRAINT rom_prk PRIMARY KEY, Num NUMBER(3) NOT NULL,
Building CHAR(5) NOT NULL,
Seats NUMBERO),
CONSTRAINT rom_unq_num_bld UNIQUE (Num, Building));
Составной первичный ключ
Составной первичный ключ указывается после определения столбцов. Его синтаксис совпадает с определением уникального ключа, за исключением названия ограничения:
[CONSTRAINT имя_ограничения] PRIMARY KEY (список_столбцов)
Если бы в таблице ROOM первичным ключом являлась пара столбцов
Num и Building, это нужно было бы записать следующим образом:
CREATE TABLE ROOM
(Num NUMBER(3),
Building CHAR(5),
Seats NUMBERO),
CONSTRAINT rom_unq_num_bld PRIMARY KEY (Num, Building));
1.10.6 Ограничение ссылочной целостности
SQL дает возможность поддерживать связь между таблицами с помощью так называемых внешних ключей. Одновременно они обеспечивают ссылочное ограничение целостности, которому посвящен данный пункт.
Внешний ключ и ссылочная целостность
Внешний ключ – это столбец (или совокупность столбцов), с помощью ко-
торого между строками двух таблиц устанавливается связь. Например, для свя-
зи между кафедрами (таблица DEPARTMENT) и факультетами (таблицы
FACULTY) в таблице DEPARTMENT помимо столбцов данных кафедры суще-
ствует дополнительный столбец FacFK, с помощью значений которого указы-
вается, какому именно факультету принадлежит кафедра. Столбец (группа столбцов), на который ссылается внешний ключ, обычно называется ссылоч-
ным ключом. Таблица, из которой делается ссылка, называется дочерней, а та,
на которую делается ссылка, – родительской (это может быть и одна таблица).
Одна и та же таблица может иметь множество внешних ключей для установле-
ния связей с несколькими таблицами. Так, таблица LECTURE учебной базы данных имеет внешние ключи для связи с таблицами ROOM (столбец RomFK), SUBJECT (столбец SbjFK), TEACHER (столбец TchFK) и SGR0UP (столбец
GrpFK).
Внешний ключ допускает значения NULL, но их можно запретить уста-
новлением ограничения NOT NULL. Это полезно, когда существует так назы-
ваемая зависимость по существованию, когда объекты одного класса не могут существовать без объектов другого класса. Например, нет смысла говорить о занятии в расписании, если не определены ведущий его преподаватель, дисци-
плина, аудитория и группа.
Внешний ключ и его ссылочный ключ должны иметь одинаковое количе-
ство столбцов и одинаковые или совместимые типы данных для соответствую-
щих столбцов. Внешний ключ, состоящий из одного столбца, называется про-
стым, а из нескольких – составным. Чаще всего используются простые внеш-
ние и соответствующие им ссылочные ключи.
Связывание внешнего ключа со ссылочным позволяет устанавливать меж-
ду таблицами отношения один-к-одному и один-ко-многим. В нашем случае имеет место отношение один-ко-многим – на одном факультете может быть не-
сколько кафедр, но каждая кафедра принадлежит только одному факультету.
Связь многие-ко-многим (как если бы кафедра подчинялась нескольким фа-
культетам) не может быть непосредственно представлена с помощью кон-
струкции ссылочный/внешний ключ.
Ссылочная целостность задается фразой FOREIGN KEY, в которой нужно указывать внешний и соответствующий ему ссылочный ключи. В этой фразе можно также указать, каким образом следует поддерживать ссылочную целост-
ность в случае изменения или удаления одного из значений ссылочного ключа.
Ссылочное ограничение, как и любое другое, задается в предложении CREATE TABLE и может быть определено как ограничение столбца или как ограниче-
ние таблицы.
Простой внешний ключ
Определение столбца как внешнего ключа имеет следующий синтаксис:
имя_столбца тип_данных [CONSTRAINT имя_ограничения] REFERENCES
имя_родительской_таблицы [столбец_родительской_таблицы]
Вэтом случае роль ссылочного ограничения исполняет фраза
REFERENCES. Например, связь между таблицами FACULTY и DEPARTMENT
указывается в таблице DEPARTMENT следующим внешним ключом:
FacFK INTEGER CONSTRAINT dep_fak_fac REFERENCES FACULTY(FacPK)
Столбец родительской таблицы можно не указывать, если ссылочный ключ является в ней первичным, то есть имеющим ограничение PRIMARY KEY. Например, так как столбец FacPK является первичным ключом в таблице
FACULTY, предыдущий пример может быть записан следующим образом:
FacFK INTEGER REFERENCES FACULTY
Составной внешний ключ
Составной внешний ключ указывается после определения столбцов табли-
цы и имеет следующий синтаксис:
[CONSTRAINT имя_ограничения] FOREIGN KEY
(список_столбцов_дочерней_таблицы) REFERENCES
имя_родительской_таблицы [(список_столбцов_родительской_таблицы)]
Учитывая, что в учебной базе данных таблица ROOM содержит простой первичный ключ RomPK и составной уникальный ключ (Num, Building), из таблицы LECTURE можно сослаться на таблицу ROOM следующими двумя способами:
CREATE TABLE LECTURE
…
RomFK INTEGERб
…
CONSTRAINT leс fkey rom FOREIGN KEY (RomFK) REFERENCES ROOM(RomPK);
и
CREATE TABLE LECTURE
RomNumFK NUMBER(3).
RomBldFK CHAR(5),
CONSTRAINT lec_fkey_rom FOREIGN KEY (RomNumFK, RomBldFK) REFERENCES ROOM (Num. Building);
Поддержка ссылочной целостности
Рассмотрим, какие имеются возможности по поддержке ссылочной це-
лостности при манипулировании строками родительской и дочерней таблиц.
При вставке или обновлении строк дочерней таблицы СУБД проверяет, нару-
шают ли эти действия ссылочную целостность. Если это так, встав-
ка/обновление строки запрещается. Удаление строки дочерней таблицы вообще не может привести к нарушению ссылочной целостности (если, конечно, она одновременно не является родительской для другой ссылки).
Вставка строки родительской таблицы не вызывает проблем с поддержкой ссылочной целостности (если, конечно, она одновременно не является дочерней для другой ссылки). А удаление или обновление ее строк может нарушить ссы-
лочную целостность. Например, если удаляемый факультет имеет в своем со-
ставе кафедры, они останутся без факультета – их внешние ключи будут ссы-
латься на отсутствующий факультет. Для этого случая стандарт SQL предлагает несколько вариантов поддержки целостности, указываемых при определении внешнего ключа с помощью следующих конструкций:
ON DELETE {RESTRICT | CASCADE | SET NULL | SET DEFAULT} ON UPDATE {RESTRICT | CASCADE | SET NULL | SET DEFAULT}
Смысл этих вариантов следующий.
RESTRICT – запрещается удалять строку (или изменять значение ссылоч-
ного ключа строки) родительской таблицы, если на эту строку имеются ссылки из дочерней таблицы.
CASCADE – удаление строки в родительской таблице приводит к удале-
нию всех связанных с ними строк дочерней таблицы. Изменение значения ссы-
лочного ключа родительской таблицы приводит к соответствующему измене-
нию значений внешних ключей дочерней таблицы.
SET NULL – удаление строки (или изменение значения ссылочного ключа)
родительской таблицы приводит к установке в значение NULL всех внеш-
них ключей дочерней таблицы, которые ссылаются на удаленные (или изме-
ненные) значения ссылочного ключа родительской таблицы.
SET DEFAULT – удаление строки (или изменение значения ссылочного ключа) родительской таблицы приводит к установке в значение по умолчанию всех внешних ключей дочерней таблицы, которые ссылаются на удаленные
(или измененные) значения ссылочного ключа родительской таблицы.
1.10.7 Изменение ограничений целостности
С помощью предложения ALTER TABLE можно осуществлять следующие переопределения таблиц, которые затрагивают ограничения целостности:
добавлять новые ограничения (столбца и таблицы);
удалять существующие ограничения (столбца и таблицы).
Изменять существующие ограничения целостности нельзя. Их нужно уда-
лить и затем определить новые.
К существующему столбцу можно добавлять только значение по умолча-
нию и ограничение NOT NULL. Все другие ограничения добавляются к столб-