Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

db / Лекции / 6 семестр / Языки запросов_1_10

.pdf
Скачиваний:
40
Добавлен:
23.03.2015
Размер:
325.31 Кб
Скачать

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. Все другие ограничения добавляются к столб-