Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Otvety_BD_2013-1.doc
Скачиваний:
139
Добавлен:
28.03.2015
Размер:
954.88 Кб
Скачать

Ограничения не-Null Ограничение не-null просто говорит, что колонка не должна содержать значение null. Пример синтаксиса:

CREATE TABLE products (

product_no integer NOT NULL,

name text NOT NULL,

price numeric);

Ограничение не-null всегда записывается как ограничение на колонку. Ограничение не-null функционально эквивалентно созданию ограничения CHECK (column_name IS NOT NULL), но в PostgreSQL создание явного ограничения не-null является более эффективным. Недостатком является то, что вы не можете явно задавать имена ограничениям не-null, которые созданны этим способом.

Ограничение NOT NULL имеет свою противоположность: ограничение NULL. Это не означает, что колонка должна содержать значение null, которое является бесполезным. Это просто означает, что при выборе значения по умолчанию для данной колонки может использоваться значение null. Ограничение NULL не определено в стандарте SQL и не должно использоваться при написании переносимых приложений. (Оно было добавлено только вPostgreSQL для совместимости с некоторыми другими СУБД). Однако, некоторым пользователям оно нравится, потому что облегчает переключение ограничений в файлах скриптов. Например, вы можете начать с

CREATE TABLE products (

product_no integer NULL,

name text NULL,

price numeric NULL);

и затем при необходимости вставить ключевое слово NOT.

Ограничения уникальности

Ограничения уникальности дают уверенность в том, что данные, содержащиеся в колонке или группе колонок являются уникальными по отношению к другим строкам в той же таблице. Синтаксис:

CREATE TABLE products (

product_no integer UNIQUE,

name text,

price numeric);

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

Такая запись говорит, что комбинация значений в указанных колонках является уникальной для всей таблицы, хотя любое одно из значений этих колонок может не быть (и обычно не является) уникальным. Ограничение уникальности нарушается, когда в таблице есть более, чем одна строка, с одинаковыми значениями колонок, включённых в это ограничение. Однако, два значения null при сравнении не признаются равными друг другу. Это означает, что даже если значения null есть в самом ограничении уникальности, можно хранить дублирующиеся строки, которые содержат значения null по крайней мере в одной из колонок, которая указывается в ограничении. Такое поведение соответствует стандарту SQL, но мы имеет сведения, что другие SQL СУБД могут не следовать этому правилу. Так что будьте осторожны, когда разрабатываете приложения, которые задумываются как переносимые.

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

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

CREATE TABLE products (

product_no integer UNIQUE NOT NULL,

name text,

price numeric);

CREATE TABLE products (

product_no integer PRIMARY KEY,

name text,

price numeric);

Первичный ключ говорит, что колонка или группа колонок могут быть использованы как уникальный идентификатор строки в таблице. (Это прямое назначение первичного ключа. Заметим, что ограничение уникальности не может выполнять такую функцию само по себе, потому что не исключает значения null). Такой идентификатор полезен как для целей документирования, так и для клиентских приложений. Например, приложение с графическим интерфейсом, которое позволяет изменять значения строк наверняка будет нуждаться в первичном ключе таблицы, чтобы идентифицировать нужные строки.

Добавление первичного ключа автоматически создаст уникальный btree индекс на колонку или группу колонок, используемых как первичный ключ.

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

Внешние ключи

Ограничение внешнего ключа говорит, что значения в колонке (или группе колонок) должно совпадать с значениями, которые существуют в некоторых строках другой таблицы. Мы говорим, что внешний ключ обслуживает ссылочную целостность между двумя относящимися друг к другу таблицами. Таблица может содержать более одного ограничения внешнего ключа. Это используется при реализации между таблицами отношений многие-ко-многим. Пусть у вас есть таблицы products и orders, но теперь вы хотите позволить таблице orders содержать несколько товаров (что не позволяет делать ранее использованная структура таблицы). Мы знаем, что внешние ключи запрещают создание строк в orders, которые не относятся к какому-либо существующему товару. Но если нужно удалить товар из таблицы products после того как в orders создана запись, которая ссылается на него? SQL позволяет вам управлять возможными действиями в этой ситуации. Напрашивается несколько вариантов:

  • Запретить удаление ссылочного продукта

  • Всё-равно удалить строку

  • Что-то другое?

Запрет на удаление и каскадное удаление являются наиболее часто употребляемыми опциями. RESTRICTпредотвращает удаление ссылочной строки. NO ACTION означает, что если во время проверки ограничения существуют какие-либо ссылающиеся строки, возникает ошибка; это поведение по умолчанию, если вы не зададите что-либо другое. (Важнейшее различие между этими двумя альтернативами состоит в том, что NO ACTIONпозволяет отложить проверку до окончания транзакции, а RESTRICT нет.) CASCADE говорит, что когда ссылочная строка удаляется, строка(и) ссылающиеся на неё, также должны быть автоматически удалены. Есть и две другие опции: SET NULL и SET DEFAULT. Они приводят к тому, что значения ссылающихся колонок будут установлены соответственно в null или в значение по умолчанию, когда ссылочная строка будет удалена. Заметим, что выполнение этих действий не освобождает вас от отслеживания каких-либо ограничений. Например, если вы задали действие SET DEFAULT, но значение по умолчанию не удовлетворяет внешнему ключу, выполнение операции приведёт к ошибке.

Аналогично ON DELETE, также существует ON UPDATE, вызов действия по которому происходит, когда ссылочная колонка изменяется (обновляется). Список возможных действий тот же самый.

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

В завершении, мы должны отметить, что внешний ключ должен ссылаться на колонки, которые либо являются первичным ключом, либо формой ограничения уникальности. Если внешний ключ ссылается на ограничение уникальности, то необходимо обратить внимание на некоторые дополнительные вещи, такие как совпадение со значениями null. Об этом рассказывается в справочной документации CREATE TABLE.

Исключение ограничений

Исключение ограничений позволяет иметь уверенность, что если любые две строки сравниваются по заданным колонкам или выражениям, которые используют заданные операторы, то по крайней мере одно из этих сравнений операторов возвратит false или null.

  1. Типы команд SQL.

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

Такими категориями (типами) команд являются:

  • DDL (Data Definition Language — язык определения данных);

  • DML (Data Manipulation Language — язык манипуляций данными);

  • DQL (Data Query Language — язык запросов к данным);

  • DCL (Data Control Language — язык управления данными);

  • команды администрирования данных;

  • команды управления транзакциями.

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