Поперечные профили набережных и береговой полосы: На городских территориях берегоукрепление проектируют с учетом технических и экономических требований, но особое значение придают эстетическим...
Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...
Топ:
Теоретическая значимость работы: Описание теоретической значимости (ценности) результатов исследования должно присутствовать во введении...
Процедура выполнения команд. Рабочий цикл процессора: Функционирование процессора в основном состоит из повторяющихся рабочих циклов, каждый из которых соответствует...
Генеалогическое древо Султанов Османской империи: Османские правители, вначале, будучи еще бейлербеями Анатолии, женились на дочерях византийских императоров...
Интересное:
Распространение рака на другие отдаленные от желудка органы: Характерных симптомов рака желудка не существует. Выраженные симптомы появляются, когда опухоль...
Средства для ингаляционного наркоза: Наркоз наступает в результате вдыхания (ингаляции) средств, которое осуществляют или с помощью маски...
Инженерная защита территорий, зданий и сооружений от опасных геологических процессов: Изучение оползневых явлений, оценка устойчивости склонов и проектирование противооползневых сооружений — актуальнейшие задачи, стоящие перед отечественными...
Дисциплины:
2019-07-12 | 172 |
5.00
из
|
Заказать работу |
Например, таблицу Студент (ID_студента, ФИО, Специальность, Примечание) можно определить традиционным образом:
CREATE TABLE С тудент (
ID _ студента INTEGER PRIMARY KEY,
ФИО CHAR (20) NOT NULL,
Специальность INTEGER CHECK (Специальность < 12),
Примечание VARCHAR
);
Однако можно сначала определить домен с именем specDomain, задав для него тип данных и ограничение:
CREATE DOMAIN specDomain INTEGER CHECK (Специальность < 12);
Обратите внимание, что в определении домена, пока не связанного ни с каким столбцом какой-либо таблицы, задается тип значений домена и ограничение на эти значения.
С учетом того, что домен specDomain создан, определение таблицы Студент можно задать следующим образом:
CREATE TABLE Студент (
ID_ студента INTEGER PRIMARY KEY,
ФИО CHAR(20) NOT NULL,
Специальность specDomain,
Примечание VARCHAR);
Ограничения для таблиц
Ограничения на вводимые данные можно назначить не только для отдельных столбцов, но и для таблицы в целом. Это удобно в тех случаях, когда необходимо для нескольких столбцов назначить одинаковые ограничения. Кроме того, если первичный ключ составной (т. е. состоит из нескольких столбцов), то указать его можно только как ограничение для таблицы, а не для столбца. Все определение ограничения для таблицы указывается после определений столбцов и состоит из ключевого слова CONSTRAINT, за которым следует выражение, определяющее непосредственно само ограничение. В табл. приведены основные ограничения для таблицы.
В следующем примере создается таблица Студент (Фамилия, имя, Отчество, Специальность, Примечание). Предполагается, что комбинация значений первых трех столбцов должна однозначно идентифицировать запись в таблице, т. е. являться первичным ключом.
CREATE TABLE Студент (
Фамилия CHAR(20),
Имя CHAR (15),
Отчество CHAR (20),
Специальность INTEGER,
Примечание VARCHAR,
CONSTRAINT PRIMARY KEY (Фамилия, Имя, Отчество)
);
Следующие два запроса на добавление записей будут выполнены, поскольку комбинации значений столбцов, определяющих первичный ключ, не содержат NULL и отличаются друг от друга:
INSERT INTO Студент (Фамилия, Имя, Отчество, Специальность)
VALUES (' Петров ', ' Петр ', ' Петрович ', 5);
INSERT INTO Студент (Фамилия, Имя, Отчество, Специальность)
VALUES (' Петров ', ' Петр ', ' Иванович ', 5);
Внешние ключи
Одна из важнейших разновидностей ограничений связана с определением внешних ключей. Внешний ключ - это столбец или группа столбцов, соответствующих первичному ключу другой таблицы. Чтобы понять синтаксис выражения, определяющего внешний ключ, рассмотрим пример.
Пусть в базе данных имеются две таблицы:
Заказы (ID_заказа, ID_клиента)- содержит сведения о том, какие заказы сделал тот или иной клиент;
Клиенты (ID_клиента, Имя, Адрес, Телефон)- сведения о клиентах (справочник).
В таблице Клиенты столбец ID_клиента является первичным ключом, т. е. его значения отличны от NULL и уникальны. В таблице Заказы столбец ID_клиента не обязан иметь уникальные значения, поскольку один и тот же клиент может сделать несколько заказов. Вместе с тем любому значению столбца Заказы. ID_клиента соответствует единственное значение столбца Клиенты.ID_клиента. При описанных условиях столбец ID_клиента таблицы Заказы является внешним ключом, ссылающимся на первичный ключ ID_клиента таблицы Клиенты.
Внешний ключ определяется как ограничение для таблицы в выражении с ключевыми словами CONSTRAIN FOREIGN KEY (ограничение "внешний ключ"):
CONSTRAINT FOREIGN KEY внешнийКлюч REFERENCES
внешняяТаблица (первичныйКлюч)
Здесь внешнийКлюч- имя столбца или список столбцов, разделенных запятыми, которые определяют внешний ключ, за ключевым словом REFERENCES (ссылки) указывается внешняя таблица и ее первичный ключ, на который ссылается внешний ключ.
Для рассмотренного ранее примера таблицу Заказы можно определить следующим образом:
CREATE TABLE Заказы (
ID_ заказа INTEGER,
ID_ клиента INTEGER,
CONSTRAINT FOREIGN KEY ID _ клиента REFERENCES Клиенты (ID _ клиента)
);
Использование внешних ключей обеспечивает сохранение ссылочной целостности базы данных при изменении и удалении записей. Если бы таблицы заказы и клиенты не были связаны, то при удалении записи из таблицы Клиенты в таблице Заказы могли остаться ссылки на клиента, о котором уже нет сведений. Этот факт обычно расценивается как аномалия удаления. В случае определения в таблице заказы внешнего ключа ID_клиента из таблицы клиенты не удастся удалить клиента, если он сделал хотя бы один заказ. Если требуется удалить из базы данных все, что касается определенного клиента, то сначала удаляются записи в таблице Заказы, а потом - в таблице Клиенты.
Аналогичная ситуация может произойти и при обновлении данных. Например, в таблице клиенты вы изменили идентификатор клиента, имеющего заказы, и, таким образом, внешнему ключу теперь не на что ссылаться. Это аномалия изменения. В данном случае необходимо сначала добавить новую запись в таблицу клиенты, указав в ней необходимое значение ID_клиента, затем изменить в таблице заказы все старые значения ID_клиента на то, которое вы только что ввели в новой записи таблицы клиенты, а затем удалить из таблицы Клиенты запись со старым идентификатором клиента.
Чтобы в таблицах, связанных внешним ключом, не делать модификацию данных в несколько этапов, в выражении CONSTRAIN FOREIGN KEY можно использовать дополнительные ключевые слова:
- ON DELETE CASCADE | SET NULL (при удалении каскадировать | установить NULL);
- ON UPDATE CASCADE| SET NULL (при обновлении каскадировать | установить NULL).
Здесь вертикальная черта не является элементом синтаксиса, а лишь разделяет возможные варианты ключевых слов.
Так, при использовании ON DELETE CASCADE в случае удаления записи со значением первичного ключа, которое имеется во внешнем ключе другой таблицы, соответствующие записи удаляются автоматически из двух таблиц. Например, при удалении из таблицы Клиенты записи о клиенте, имеющем заказы, в таблице Заказы также будут удалены все записи, ссылающиеся на данного клиента. Чтобы данная стратегия выполнялась, таблица Заказы должна быть определена следующим образом:
CREATE TABLE Заказы (
ID_ заказа INTEGER,
ID_ клиента INTEGER,
CONSTRAINT FOREIGN KEY ID _ клиента REFERENCES Клиенты (ID_ клиента)
ON DELETE CASCADE
);
Однако на практике обычно предпочитают сначала убедиться, что клиент не имеет заказов, и лишь затем вычеркнуть его из справочника.
Вариант SET NULL обычно используется при обновлении данных.
Например:
CREATE TABLE Заказы (
ID _ заказа INTEGER,
ID _ клиента INTEGER,
CONSTRAINT FOREIGN KEY ID_ клиента REFERENCES Клиенты (ID_ клиента)
ON UPDATE SET NULL
);
В данном случае при изменении (в том числе и при удалении) в таблице Клиенты записи, на которую ссылается внешний ключ таблицы Заказы, значения внешнего ключа устанавливаются в NULL. Однако этот вариант не сработает, если на столбец Заказы. ID_клиента наложено ограничение NOT NULL. Обычно так и бывает, поскольку при оформлении заказа клиент должен быть обязательно указан. Поэтому, на всякий случай, лучше использовать ключевые слова ON UPDATE CASCADE.
Удаление таблиц
Удалить таблицу из базы данных можно следующим образом:
DROP TABLE имяТаблицы;
Разумеется, при удалении таблицы теряются и все содержащиеся в ней данные. Во время работы с базой данных нередко создаются таблицы для временного хранения данных, полученных на каком-то промежуточном этапе. Рано или поздно такие таблицы подлежат удалению. Однако можно забыть это сделать. Кроме того, промежуточные таблицы, создаваемые приложениями, могут остаться в базе данных из-за сбоев. Поэтому для создания временных таблиц лучше использовать оператор CREATE TEMPORARY TABLE,а не CREATE TABLE.
Модификация таблиц
Разработка базы данных обычно происходит итеративно. Редко когда удается сразу оптимально определить структуру входящих в нее таблиц, чтобы потом их не переделывать. Кроме того, уже готовая база данных со временем может пополняться новыми таблицами, которые связываются с уже имеющимися. А установка новых связей требует коррекции параметров в старых таблицах. Модификация таблицы - это изменение ее структуры, т. е. добавление, удаление и переименование столбцов, а также изменение их типов и размеров.
Язык SQL обладает специальными средствами модификации таблиц. Если бы их не было или если отказаться их применять, то изменение структуры таблицы можно выполнить следующим образом:
1. Создать новую рабочую таблицу с необходимой структурой.
2. С помощью оператора INSERT INTO вставить в рабочую таблицу данные из исходной таблицы.
3. Удалить исходную таблицу.
4. Переименовать рабочую таблицу, присвоив ей имя исходной.
Все предыдущие операции можно выполнить посредством рассмотренных ранее операторов SQL. Переименование таблицы можно сделать средствами программной среды разработки базы данных. Если же ограничиться только операторами SQL, то вместо переименования придется выполнить следующее:
1. Создать новую таблицу с именем исходной и с такой же структурой, как у рабочей таблицы.
2. С помощью оператора INSERT INTO вставить в новую таблицу данные из рабочей таблицы.
3. Удалить рабочую таблицу.
Как видите, изменение структуры таблицы обычными операторами SQL довольно трудоемко. Значительно проще изменить структуру таблицы с помощью оператора ALTER TABLE (изменить таблицу). С помощью дополнительных ключевых слов можно выполнить следующие операции:
– ADD COLUMN - добавить столбец;
– DROP COLUMN - удалить столбец;
– ALTER COLUMN - изменить тип, размер и ограничение столбца;
– RENAME COLUMN - переименовать столбец;
– RENAME ТО - переименовать таблицу.
Типичной задачей изменения структуры таблицы является добавление столбца. Это можно сделать с помощью SQL-выражения с таким синтаксисом:
Индивидуальные очистные сооружения: К классу индивидуальных очистных сооружений относят сооружения, пропускная способность которых...
Биохимия спиртового брожения: Основу технологии получения пива составляет спиртовое брожение, - при котором сахар превращается...
История развития пистолетов-пулеметов: Предпосылкой для возникновения пистолетов-пулеметов послужила давняя тенденция тяготения винтовок...
Эмиссия газов от очистных сооружений канализации: В последние годы внимание мирового сообщества сосредоточено на экологических проблемах...
© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!