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

SQL в вопросах и задачах

.pdf
Скачиваний:
34
Добавлен:
21.05.2015
Размер:
917.91 Кб
Скачать

91

оп исания столбца (з ап ятой). О гранич ения на таблицу раз мещ а ются в конце оп ред еления та блицы, п осле оп ред еления п ослед него столбца. К оманд а CREATE TABLE имеет след ующ ий синтаксис, расширенный в ключ ением огранич ений

CREATE TABLE <и м ят а бли цы >

(<и м яст о лбца > <т и п д а нны х> <о гр а ни чени яна ст о лбец>, <и м яст о лбца > <т и п д а нны х> <о гр а ни чени яна ст о лбец>,…

<о гр а ни чени яна т а бли цу> (<и м яст о лбца >[,<и м яст о лбца >… ])… );

Поля, з ад анныев круглых скобках п ослеоп исанияогранич ений таблицы

– это п оля, на которыеэ ти огранич енияра сп ространяются. О гранич ения на столбцы п рименяютсяк темстолбцам, з а которыми они оп иса ны.

4.5.1. О граничение NOT NULL

Ч тобы з ап ретитьв оз можностьисп ольз ов а ния в

п оле NULL-з нач ений,

можно п ри

соз д ании та блицы кома нд ой

CREATE

TABLE

указ а ть д ля

соотв етств ующ его столбца

ключ ев ое слов о

NOT NULL. Э то

огранич ение

п рименимо только к столбца м таблицы. К ак ужегов орилосьв ыше, NULL

это сп ециальный маркер , обоз нач ающ ий тот факт,

ч то п оле п усто. Н о он

п олез ен не в сегд а. Пер в ич ные ключ и, на п ример,

в

п ринцип е не д олжны

сод ержать NULL-з нач ений (быть п устыми),

п оскольку э то нарушило

бы

требов ание

уникальности

п ер в ич ного

ключ а

 

(более

строго

функциональную з а в исимостьатрибутов таблицы от п ерв ич ного ключ а). Во

многих д ругих случ аях также необход имо, ч тобы п оля

о бяза т ельно

сод ержали оп р ед еленные з нач ения. Е сли ключ ев ое слов о

NOT NULL

раз мещ аетсянеп осред ств енно п ослетип а д анных (в ключ аяраз мер) столбца ,

то любые п оп ытки остав итьз на ч ение п оля п устым (в в ести в

п оле NULL-

з нач ение) буд ут отв ергнуты системой.

 

Н а п ример, д лятого, ч тобы в оп ред елении таблицы STUDENT з ап ретить

исп ольз ов ание NULL-з нач ений д ля столбцов STUDENT_ID,

SURNAME и

NAME, можно з ап исатьслед ующ ее:

 

CREATE TABLE STUDENT

(STUDENT_ID INTEGER NOT NULL,

 

92

SURNAME

CHAR (25) NOT NULL,

NAME

CHAR (10) NOT NULL,

STIPEND

INTEGER,

KURS

INTEGER,

CITY

CHAR (15),

BIRTHDAY

DATE,

UNIV_ID

INTEGER);

Важно п омнить, ч то,

если д ля столбца указ ано NOT NULL, то п ри

исп ольз ов ании команд ы

INSERT

обяз ательно

д олжно

быть ука з ано

конкретноез нач ение, в в од имоев это п оле. При отсутств ии огранич енияNOT

NULL в столбце з нач ение может отсутств ов ать, если только не ука з ано

з нач ение столбца п о умолч анию (DEFAULT). Если

п р и соз д ании таблицы

огранич ение NOT NULL не было ука з ано, то его

можно

указ ать п оз же,

исп ольз уя команд у ALTER TABLE.

О д на ко, д ля того, ч тобы д ля в нов ь

в в од имого с п омощ ью кома нд ы ALTER TABLE столбца можно было з а д ать

огранич ение NOT NULL, таблица, в

которую д обав ляется столбец, д олжна

бытьп устой.

 

 

 

 

4.5.2. Уникал ь ност ь как ограничение на ст ол бец

Иногд а тр ебуется, ч тобы в сез на ч ения, в в ед енныев столбец, отлич а лись

д руг от

д руга. Н а п р имер, э того

требуют

п ер в ич ные ключ и. Е сли

п ри

соз д а нии таблицы

д ля столбца указ ыв а ется огранич ение UNIQUE,

то

баз а

д анных

отв ерга ет

любую п оп ытку

в в ести в

это п оле какой-либо

строки

з нач ение, ужесод ержащ еесяв том жеп олед ругой строки. Э то огранич ение п рименимо только к тем п олям, которыебыли объяв лены NOT NULL. М ожно п ред ложить след ующ ее оп ред еление таблицы STUDENT, исп ольз ующ ее огранич ениеUNIQUE.

CREATE TABLE STUDENT

(STUDENT_ID

INTEGER NOT NULL UNIQUE,

SURNAME

CHAR (25) NOT NULL,

NAME

CHAR (10) NOT NULL,

STIPEND

INTEGER,

KURS

INTEGER,

CITY

CHAR (15),

 

93

BIRTHDAY

DATE,

UNIV_ID

INTEGER);

О бъяв ляяп олеSTUDENT_ID уника льным, можно бытьув еренным, ч то в

таблице не п ояв ится

з а п исей д ля д в ух студ ентов с од инаков ыми

ид ентификаторами. Столбцы, отлич ныеот п ерв ич ного ключ а, д ля которых требуется п од д ержать уника льность з нач ений, наз ыв а ются в оз можными ключ ами или уникальными ключ ами (CANDIDATE KEYS или UNIQUE KEYS).

4.5.3. Уникал ь ност ь как ограничение т абл иц ы

М ожно сд елатьуникальными груп п у п олей, указ а в UNIQUE в кач еств е

огранич ений т а бли цы . При объед инении п олей

груп п у в а жен п оряд ок, в

котором они ука з ыв а ются.

О гранич ение на

таблицу UNIQUE яв ляется

п олез ным, если

требуется

п од д ержив ать уника льность груп п ы п олей.

Н а п ример, если в

нашей баз ед а нных нед оп ускается, ч тобы студ ент сд а в ал в

од ин д еньбольшеод ного экз амена, то можно в таблицеобъяв итьуника льной комбина цию з нач ений п олей STUDENT_ID и EXAM_DATE. Д ляэтого след ует соз д а тьтаблицу EXAM_MARKS такимсп особом.

CREATE TABLE EXAM_MARKS

(EXAM_ID

INTEGER NOT NULL,

STUDENT_ID

INTEGER NOT NULL,

SUBJ_ID

INTEGER NOT NULL,

MARK

CHAR (1),

EXAM_DATE

DATE NOT NULL,

UNIQUE (STUDENT_ID, EXAM_DATE));

О братитев нима ние, ч то оба п оля в огра нич ении таблицы UNIQUE в се ещ еисп ольз уют огра нич ениестолбца – NOT NULL. Е сли бы исп ольз ов а лось огранич ениестолбца UNIQUE д ляп оля STUDENT_ID, то такоеогранич ение таблицы было бы необяз ательным.

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

94

След ов а тельно, указ а ние п олез но исп ольз ов а ть в инд ив ид уальных п олей, рассма трив аемомп римере.

UNIQUE

как огра нич ение таблицы

наиболее

случ а ях,

когд а

не требуется уника льность

как это

имеет

место на самом

д еле в

4.5.4. П рисвоение им ен ограничения м

О гра нич ениям та блиц можно п рисв а ив ать уникальные имена.

Преимущ еств о яв ного з ад анияимени огранич ениясостоит в

том, ч то в этом

случ а е п ри в ыд ач е системой

сообщ ения о

нарушении

установ ленного

огранич ениябуд ет указ ано его имя, ч то уп рощ ает обнаружениеошибок.

Д ля п рисв оения имени

огранич ению

исп ольз уется несколько

из мененный синтаксис кома нд CREATE TABLE и ALTER TABLE.

Прив ед енный в ышеп ример з ап роса из меняетсяслед ующ имобраз ом:

CREATE TABLE EXAM_MARKS

(EXAM_ID

INTEGER NOT NULL,

STUDENT_ID

INTEGER NOT NULL,

SUBJ_ID

INTEGER NOT NULL,

MARK

CHAR (1),

EXAM_DATE

DATE NOT NULL,

CONSTRAINT STUD_SUBJ_CONSTR

UNIQUE (STUDENT_ID, EXAM_DATE);

В этом з а п росе STUD_SUBJ_CONSTR – это имя, п рисв оенное указ анному огранич ениюта блицы.

4.5.5. О граничение первичны х кл ю чей

 

П ер ви чны е ключи

т а бли цы – это сп ециа льныеслуч аи комбиниров а ния

огранич ений UNIQUE и NOT NULL. Перв ич ные ключ и имеют след ующ ие

особенности:

 

таблица может сод ержа тьтолько од ин п ер в ич ный ключ ;

в нешниеключ и п о умолч а ниюссыла ютсяна п ерв ич ный ключ та блицы;

п ерв ич ный ключ

яв ляется ид ентификатор ом строк таблицы (строки,

од нако, могут ид ентифицир ов атьсяи д ругими сп особами).

95

У луч шенный в ар иант соз д ания таблицы STUDENT1 с объяв ленным п ерв ич нымключ омимеет теп ер ьслед ующ ий в ид :

CREATE TABLE STUDENT

(STUDENT_ID

INTEGER PRIMARY KEY,

SURNAME

CHAR (25) NOT NULL,

NAME

CHAR (10) NOT NULL,

STIPEND

INTEGER,

KURS

INTEGER,

CITY

CHAR (15),

BIRTHDAY

DATE,

UNIV_ID

INTEGER);

4.5.6. С ост авны е первичны е кл ю чи

О гра нич ение

PRIMARY KEY

может также быть п р именено

д ля

нескольких п олей,

состав ляющ их

уника льную комбинацию з нач ений –

со ст а вно й п ерв ич ный ключ . Рассмотрим таблицу EXAM_MARKS. О ч ев ид но,

ч то ни к п олю

ид ентификатора

студ ента (STUDENT_ID), ни

к

п олю

ид ентификатора

п ред мета обуч ения (EXAM_ID) п о отд ельности

нельз я

п ред ъяв итьтребов аниеуника льности. О д на ко, д лятого, ч тобы в таблицене могли п ояв итьсяраз ныез ап иси д ляод инаков ых комбина ций з на ч ений п олей STUDENT_ID и EXAM_ID (конкретный студ ент на конкр етном э кз аменене

может п олуч итьболее од ной оценки),

имеет смысл объяв итьуника льной

комбина цию этих п олей.

Д ля этого

мы можем п рименить огранич ение

таблицы PRIMARY KEY, объяв ив п ару EXAM_ID и STUDENT_ID п ерв ич ным

ключ омтаблицы:

 

 

CREATE TABLE NEW_EXAM_MARKS

(STUDENT_ID

INTEGER NOT NULL,

SUBJ_ID

INTEGER NOT NULL,

MARK

INTEGER,

 

DATA

DATE,

 

CONSTRAINT EX_PR_KEY PRIMARY KEY (EXAM_ID, STUDENT_ID));

96

4.5.7. П роверка з начений пол ей

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

Рассмотрим таблицу STUDENT. Знач ение столбца STIPEND в этой таблице STUDENT в ыражается д есятич ным ч ислом. Н аложим на з на ч ения этого столбца след ующ ееогранич ение– в елич ина раз мера стип енд ии д олжна бытьменьше200.

Соотв етств ующ ий з ап рос имеет след ующ ий в ид .

CREATE TABLE STUDENT

(STUDENT_ID

INTEGER PRIMARY KEY,

SURNAME

CHAR (25) NOT NULL,

NAME

CHAR (10) NOT NULL,

STIPEND

INTEGER CHECK (STIPEND < 200),

KURS

INTEGER,

CITY

CHAR (15),

BIRTHDAY

DATE,

UNIV_ID

INTEGER);

4.5.8. П роверка ограничиваю щ их усл овий с испол ь з ованием сост авны х пол ей

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

Пред п оложим, ч то огранич ение на раз мер стип енд ии

(меньше 200)

д олжно ра сп ространяться только на студ ентов , жив ущ их в

Воронеже. Э то

можно указ атьв з а п росесо след ующ имтаблич нымогранич ениемCHECK:

 

97

CREATE TABLE STUDENT

(STUDENT_ID

INTEGER PRIMARY KEY,

SURNAME

CHAR(25) NOT NULL,

NAME

CHAR (10) NOT NULL,

STIPEND

INTEGER,

KURS

INTEGER,

CITY

CHAR(15),

BIRTHDAY

DATE,

UNIV_ID

INTEGER UNIQUE,

CHECK(STIPEND < 200 AND CITY = ‘Во р о н еж ));

или в несколько д ругой з ап иси

CREATE TABLE STUDENT

(STUDENT_ID

INTEGER PRIMARY KEY,

SURNAME

CHAR(25) NOT NULL,

NAME

CHAR (10) NOT NULL,

STIPEND

INTEGER,

KURS

INTEGER,

CITY

CHAR(15),

BIRTHDAY

DATE,

UNIV_ID

INTEGER UNIQUE,

CONSTRAINT STUD_CHECK CHECK (STIPEND < 200

AND CITY = ‘Во р о н еж ));

4.5.9. Уст ановка з начений поум ол чанию

В SQL имеетсяв оз можностьп ри в ста в кев таблицу строки, неука з ыв ая з нач ений некоторого п оля, оп ред елятьз нач ениеэтого п оля п о умолч анию. Н а иболееч асто исп ольз уемымз на ч ением п о умолч аниюяв ляетсяNULL. Э то з нач ениеп ринимается п о умолч анию д ля любого столбца, д ля которого не было уста нов лено огранич ениеNOT NULL.

Зна ч ение п оля п о умолч анию ука з ыв ается в кома нд е CREATE TABLE темжесп особом, ч то и огра нич ениестолбца, с п омощ ьюключ ев ого слов а

DEFAULT <зна чени е по ум о лча ни ю>.

Строго гов оря, оп ция DEFAULT не имеет огранич ительного св ойств а, так как она не огра нич ив ает з нач ения, в в од имые в п оле, а п р осто

98

конкретиз ирует з нач ениеп оляв случ ае, если оно не бы ло за д а но .

Пред п оложим,

ч то основ на я масса

студ ентов , информация о которых

наход ится в таблицеSTUDENT, п рожив ает

Воронеже.

Ч тобы п ри з ад ании

атрибутов

не

 

в в од ить д ля большинств а студ ентов

наз в а ние город а

Во р о н еж ,

можно установ итьего как з нач ениеп оля CITY п о умолч анию,

оп ред елив таблицу STUDENT след ующ имобраз ом:

 

 

 

 

 

CREATE TABLE STUDENT

 

 

 

 

 

 

 

 

 

 

( STUDENT_ID INTEGER PRIMARY KEY,

 

 

 

 

 

 

SURNAME

CHAR (25) NOT NULL,

 

 

 

 

 

 

NAME

 

 

CHAR (10) NOT NULL,

 

 

 

 

 

 

STIPEND

INTEGER CHECK (STIPEND < 200),

 

 

 

KURS

 

 

INTEGER,

 

 

 

 

 

 

 

 

 

CITY

 

 

CHAR (15) DEFAULT Во р о н еж ,

 

 

 

 

BIRTHDAY

DATE,

 

 

 

 

 

 

 

 

 

 

UNIV_ID

 

INTEGER);

 

 

 

 

 

 

 

 

Д ругаяцельп рактич еского п римененияз ад а нияз нач енияп о умолч а нию

– это исп ольз ов а ниеего как альтернатив ы д ля NULL.

К ак уже отмеч а лось

в ыше, п рисутств иеNULL в кач еств ев оз можных з нач ений п олясущ еств енно

усложняет

интерп ретацию

оп ераций

срав нения, в

которых

уч а ств уют

з нач ениятаких п олей, п оскольку NULL п ред став ляет собой п риз нак того, ч то

фактич ескоез нач ениеп оля неи звест но

или нео пр ед еленно . След ов ательно,

строго

гов ор я,

срав нение с ним любого

конкретного

 

з на ч ения в рамках

д в уз нач ной

булев ой

логики

яв ляется не корр ектным, з а

исключ ением

сп ециа льной оп ерации сра в нения IS NULL, котор аяоп ред еляет,

яв ляетсяли

сод ержимое

п оля

ка ким-либо

з нач ением

или

 

оно

отсутств ует.

Д ейств ительно,

каким образом в

рамках

д в уз нач ной

 

логики отв етить на

в оп рос

истинно

или

ложно

услов ие: CITY =

Во р о н еж ,

если текущ ее

з нач ениеп оляCITY неиз в естно (сод ержит NULL).

 

NULL

 

 

Во

многих

случ аях

исп ольз ов ание

в место

 

з нач ения,

п од ста в ляемого

 

п оле п о

умолч анию,

может сущ еств енно

уп ростить

исп ольз ов аниез нач ений п оляв п ред икатах.

 

 

 

 

 

 

 

Н а п ример,

 

можно установ итьд ля столбца

оп цию NOT

NULL, а

д ля

неоп ред еленных

з нач ений

ч ислов ого

тип а

уста нов ить

з нач ение

п о

99

умолч анию“рав но нулю”, или д ляп олей тип а CHAR – п робел, исп ольз ов ание которых в оп ера циях сра в нениянев ыз ыв ает никаких п роблем.

При исп ольз ов а нии з нач ений п о умолч а нию в

п ринцип е д оп устимо

п рименятьогранич енияUNIQUE или PRIMARY KEY в

этом п оле. При этом,

од нако, след ует иметьв в ид у отсутств иев та комогранич ении п ра ктич еского смысла, п оскольку только од на стр ока в таблицесможет п ринятьз нач ение, сов п а д ающ ее с этим з нач ением п о умолч анию. Д ля та кого п рименения з ад а нияп о умолч анию необход имо (д о в ста в ки д ругой строки с уста нов кой п о умолч а нию) мод ифициров ать п ред ыд ущ ую строку, сод ержащ ую такое з нач ение.

УП Р АЖ НЕ НИ Я

 

 

 

 

1.

Соз д айтетаблицу EXAM_MARKS так, ч тобы нед оп уска лсяв в од в таблицу

 

д в ух з а п исей об

оценка х од ного

студ ента п о конкретным экз амену и

 

п ред мету обуч ения, а та кже, ч тобы не д оп уска лось п ров ед ение д в ух

 

экз аменов п о любымп ред мета мв од ин д ень.

 

 

2.

Соз д айтетаблицу п ред метов обуч ения SUBJECT так, ч тобы колич еств о

 

отв од имых на

п ред мет ч асов

п о умолч а нию было

рав но

36, не

 

д оп уска лисьз ап иси с отсутств ующ им колич еств ом ч асов , п олеSUBJ_ID

 

яв лялось п ер в ич ным ключ ом таблицы, и з нач ения семестров

(п оле

 

SEMESTR) лежа ли в д иа п аз онеот1-го д о 12-ти.

 

 

3.

Соз д айте таблицу EXAM_MARKS та ким образ ом, ч тобы

з нач ения п оля

 

EXAM_ID были

больше з на ч ений п оля SUBJ_ID, а

з нач ения п оля

 

SUBJ_ID были большез нач ений п оля STUDENT_ID; п устьтакжебуд ут

 

з ап рещ ены з нач енияNULL в любомиз этих трех п олей.

 

 

100

4.6. П оддерж ка ц ел ост ност и данны х

В та блица х рассма трив аемой баз ы д а нных з на ч ения некотор ых п олей св яз аны д руг с д ругом. Та к п олеSTUDENT_ID в таблицеSTUDENT и п оле STUDENT_ID в таблицеEXAM_MARKS св яз аны тем, ч то оп исыв а ют од ни и те же объекты, то есть сод ержат ид ентифика торы студ ентов , инфор ма ция о

которых хранится в

баз е. Б олеетого, з нач ения ид ентификатор ов студ ентов ,

которыед оп устимы

таблицеEXAM_MARKS,

д олжны в ыбираться только из

сп иска з нач ений STUDENT_ID, фактич ески

п р исутств ующ их в

таблице

STUDENT, то есть п ринад лежа щ их реально оп иса нным в ба з е студ ентам.

А налогич но,

з нач ения п оля UNIV_ID

таблицы

STUDENT

д олжны

соотв етств ов ать ид ентификаторам унив ерситетов UNIV_ID, фактич ески

п рисутств ующ им в

та блице UNIVERSITY,

а

з нач ения п оля SUBJ_ID

таблицы EXAM_MARKS д олжны соотв етств ов атьид ентификатора мп ред метов

обуч ения, фактич ески п рисутств ующ имв таблицеSYBJECT.

 

О гра нич ения,

наклад ыв а емые указ анным

тип ом

св яз и, наз ыв а ются

о гр а ни чени ям и

ссы ло чно й цело ст но ст и .

О ни

состав ляют в ажную ч а сть

оп исания характеристик п ред метной области,

обесп еч ения корректности

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

4.6.1. В неш ние и родит ел ь ские кл ю чи

К огд а ка жд ое з нач ение, п р исутств ующ ее од ном п оле та блицы, п ред став лено в д ругомп олед ругой или э той жета блицы, гов орят, ч то п ер в ое п олессылаетсяна в торое. Э то указ ыв ает на п рямуюсв яз ьмежд у з на ч ениями д в ух п олей. Поле, котороессылается на д ругоеп оле, наз ыв ается в неш ним

к лю ч ом , а

п оле, на

которое ссылается д ругое п оле, наз ыв ается

р одит ельск им

к лю ч ом . Так ч то п оле UNIV_ID таблицы STUDENT – это

в нешний ключ

(оно ссылается на п олед ругой таблицы), а п оле UNIV_ID

таблицы UNIVERSITY,

на ко т о р о е ссылается этот в нешний ключ – это

род ительский ключ .

 

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]