Помимо ограничений столбцов и доменов, о которых говорилось в прошлой лекции, существуют еще ограничения базы данных.
Базы данных могут использовать следующие виды ограничений:
Если вы похожи на автора данного курса в том, что любите искать ответы на интересующий вас вопрос комплексно, в разных трудах разных авторов, то вы не могли не заметить некоторую путаницу в определениях главная (master) -> подчиненная (detail) таблицы. Напомним, что главную таблицу часто называют родительской, а подчиненную - дочерней.
Связано это, вероятно, с тем, как интерпретируются эти определения в локальных и SQL -серверных СУБД.
В локальных СУБД главной называется та таблица, которая содержит основные данные, а подчиненной - дополнительные. Возьмем, к примеру, три связанные таблицы. Первая содержит данные о продажах, вторая - о товарах и третья - о покупателях:
(рис 18.1) Связи главная-подчиненнаяЗдесь основные сведения хранятся в таблице продаж, следовательно, она главная (родительская). Дополнительные сведения хранятся в таблицах товаров и покупателей, значит они дочерние. Это и понятно: одна дочь не может иметь двух биологических матерей, зато одна мать вполне способна родить двух дочерей.
Но в SQL -серверах баз данных имеется другое определение связей: когда одно поле в таблице ссылается на поле другой таблицы, оно называется
Так что в приведенном выше примере таблица продаж имеет два внешних ключа: идентификатор товара, и идентификатор покупателя. А обе таблицы в правой части рисунка имеют сервер БД, этими определениями мы и будем руководствоваться в последующих лекциях. Чтобы далее не ломать голову над этой путаницей, сразу договоримся: дочерняя таблица имеет
Parent ). Не стоит путать автоматически создает для него
Предположим, имеется таблица со списком сотрудников. Поле "Фамилия" может содержать одинаковые значения (однофамильцы), поэтому его нельзя использовать в качестве первичного ключа. Редко, но встречаются однофамильцы, которые вдобавок имеют и одинаковые имена. Еще реже, но встречаются полные тезки, поэтому даже все три поля "Фамилия" + "Имя" + "Отчество" не могут гарантировать уникальности записи, и не могут быть первичным ключом. В данном случае выход, как и прежде, в том, чтобы добавить поле - идентификатор, которое содержит порядковый номер данного лица. Такие поля обычно делают автоинкрементными (об организации автоинкрементных полей поговорим на следующих лекциях). Итак,
Если в
CREATE TABLE Prim_1( Stolbec1 INT NOT NULL PRIMARY KEY, Stolbec2 VARCHAR(50))
Если
CREATE TABLE Prim_2( Stolbec1 INT NOT NULL, Stolbec2 VARCHAR(50) NOT NULL, PRIMARY KEY (Stolbec1, Stolbec2))
Как видно из примеров,
Столбец, объявленный с ограничением
CREATE TABLE Prim_3( Stolbec1 INT NOT NULL PRIMARY KEY, Stolbec2 VARCHAR(50) NOT NULL UNIQUE, Stolbec3 FLOAT NOT NULL UNIQUE)
Child ) по отношению к другим таблицам. Ссылочная целостность обеспечивается именно внешним ключом, который ссылается на первичный или
Вернемся к рисунку 18.1. Если мы удалим сведения о каком-то покупателе в таблице покупателей, таблица продаж станет недостоверной - она будет содержать ссылки, которые на самом деле никуда не ссылаются. Чтобы обеспечить достоверность данных, нужно воспрепятствовать удалению записи с покупателем, если на эту запись есть ссылки в таблице продаж. Либо же при удалении записи с покупателем нужно автоматически удалить и все записи таблицы продаж, ссылающиеся на этого покупателя. Если же меняется значение идентификатора в таблице покупателей, значит нужно также изменить это значение во всех записях таблицы продаж, которые ссылаются на данного покупателя.
Для обеспечения достоверности данных и применяют
Внешний ключ - это столбец или набор столбцов в дочерней таблице, который в точности соответствует столбцу или набору столбцов, определенных в родительской таблице как первичный (или уникальный) ключ, и ссылается на них.
В отличие от первичного ключа, ключ
CREATE TABLE Roditel( R_ID VARCHAR(20) NOT NULL PRIMARY KEY, R_Other INT); COMMIT; CREATE TABLE Doch( D_ID VARCHAR(20), D_Other INT, FOREIGN KEY (D_ID) REFERENCES Roditel ON UPDATE CASCADE ON DELETE NO ACTION); COMMIT;
(рис 18.2) Результат совместной работы родительской и дочерней таблицЧто мы получили в итоге? Родительская таблица имеет
R_ID ) в D_ID ) R_ID InterBase не даст удалить Внешний ключ имеет такой синтаксис:
FOREIGN KEY (список_столбцов_дочерней_таблицы)
REFERENCES <имя_родительской_таблицы>
[<список_столбцов_родительской_таблицы>]
[ON DELETE {NO ACTION | CASCADE | SET DEFAULT | SET NULL}]
[ON UPDATE {NO ACTION | CASCADE | SET DEFAULT | SET NULL}]
Разберем этот синтаксис.
список_столбцов_дочерней_таблицы - это один или несколько столбцов, которые являются внешним ключом.
<имя_родительской_таблицы> - имя
[<список_столбцов_родительской_таблицы>] - один или несколько столбцов, являющихся ключевыми для связи таблиц. Это необязательный параметр, его можно не указывать, если связь строится по первичному ключу
Необязательные параметры соответственно, при удалении или
В приведенном выше примере с родительской и
Ссылочную целостность, объявленную внешним ключом, можно именовать. Делается это для более удобного управления этим ограничением: если ссылочная целостность имеет имя, ее можно удалить командой DROP, сославшись на ее имя. Для именования используется оператор
CONSTRAINT <Имя_ссылочной_целостности>
Создадим еще две таблицы, одна из которых ссылается на другую:
CREATE TABLE Roditel2( R_ID VARCHAR(20) NOT NULL PRIMARY KEY, R_Celoe INT); COMMIT; CREATE TABLE Doch2( D_ID VARCHAR(20), D_Celoe INT, CONSTRAINT Cons_Doch2 FOREIGN KEY (D_ID) REFERENCES Roditel2 ON UPDATE CASCADE ON DELETE NO ACTION); COMMIT;
Чтобы удалить эти таблицы, нужно вначале удалить ссылочную целостность:
ALTER TABLE Doch2 DROP CONSTRAINT Cons_Doch2
Внимание! При удалении ограничения вы можете получить ошибку "object is in use" (объект находится в использовании). Это говорит о том, что на какую-то из таблиц имеется незавершенная транзакция.
Просто завершите работу IBConsole, и снова загрузите ее, тогда все получится. После удаления ссылочной целостности можно удалить и таблицы:
DROP TABLE Doch2; DROP TABLE Roditel2;
Еще одно важное замечание: в нет ссылочных целостностей без идентификатора! Если вы не дали имени ссылочной целостности, делает это автоматически. Выделите в IBConsole пункт Tables, чтобы в правой части окна появился список таблиц базы данных. Затем щелкните правой кнопкой по таблице DOCH из первого примера (именно в ней мы создавали
(рис 18.4) Кнопка Show Check Constraints показывает ограничения таблицыВ окне вы увидите имя ограничения, которое автоматически было дано , у меня это INTEG _31, у вас оно может быть другим. Теперь, зная имя ограничения, самостоятельно удалите его, после чего удалите таблицы DOCH и RODITEL.
С индексами вы уже знакомы по локальным базам данных, в они используются для тех же целей: для ускорения поиска и сортировки нужных записей.
Индекс - это упорядоченный указатель на записи в таблице.
хранятся отдельно от таблицы, и фактически представляют собой упорядоченные пары "значение поля" -> "физическое расположение этого значения в таблице". В одной таблице может быть до 64 индексов, причем сортировку в них можно указывать как в возрастающем, так и в убывающем порядке. Синтаксис создания индекса следующий:
CREATE [UNIQUE] {[ASC[ENDING] | DESC[ENDING]]}
INDEX <IndexName> ON <TableName> (<col> [, <col> … ]);
Как вы уже знаете, в квадратные скобки заключены необязательные параметры команды. То есть, минимальным выражением создания индекса может быть:
CREATE INDEX Sklad_Index ON SKLAD(ID_TOVAR)
Выделив в раздел Indexes, в правой части окна вы увидите список индексов БД. Как вы заметили, помимо только что созданного индекса имеются и другие, которые построены по столбцам, указанным в первичных и уникальных ключах. Дело в том, что индексы используют такой же механизм упорядочивания записей, как и ключи, так что разница между ними в основном, логического характера.
Необязательный параметр
Необязательный параметр ASC или
Как и ключ, индекс может быть построен не по одному столбцу, а по нескольким, однако этим увлекаться не стоит - использование составного индекса иногда даже замедляет работу с БД.
Еще одно замечание: в отличие от локальных БД, в нельзя указать индекс, используемый при сортировке. Когда вы делаете запрос, автоматически применяет наиболее подходящий индекс и использует его для поиска записи.
Удаляется индекс обычным способом:
DROP INDEX <Index_Name>
Интенсивная работа с базой данных может привести к тому, что индексы становятся разбалансированными, значения в них располагаются, как попало, и использование индекса не ускоряет, а даже замедляет поиск данных. В этом случае поможет перестройка индексов:
ALTER INDEX <Index_Name> INACTIVE; ALTER INDEX <Index_Name> ACTIVE;
Первая команда отключает индекс, вторая подключает его вновь. Имеется ряд ограничений на эти действия:
SYSDBA ) или быть создателем данного индекса.Обычно администратор дожидается, пока все уйдут на обед, подключается к базе данных в монопольном режиме и перестраивает индексы. Однако это только полумера. В идеале, для оптимизации работы БД, время от времени индексы нужно удалять, а затем снова их создавать. Само собой, для этих действий также нужен монопольный режим и права администратора БД.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.