Таблицы в SQL
1) Создание структуры таблицы
CREATE [{GLOBAL|LOCAL} TEMPORARY]
TABLE <имя таблицы>
[LIKE <имя таблицы> [<опции копирования>]]|
(<определение столбцов> [<, ограничения таблицы>])|
[AS <запрос> [WITH [NO] DATA]]
Примечание:
В SQL Server перед именем временной таблицы ставится символ @@|@.
2) Опции копирования
При копировании (LIKE) таблицы из уже имеющейся могут быть включены опции копирования, подразумевающие следующую конструкцию:
{INCLUDING|EXCLUDING}
{IDENTITY|DEFAULTS|GENERATED}
Примечания:
INCLUDING|EXCLUDING – добавить/удалить ограничения столбца.
IDENTITY|DEFAULTS|GENERATED – включить соответствующие свойства столбца.
3) Определение столбца
<имя столбца> {<имя домена>|
<тип данных> [(<размер>)]}
[<ограничения столбца>]
[DEFAULT <значение по умолчанию>]
4) Ограничения столбца
[CONSTRAINT <имя ограничения>]
NOT NULL|PRIMARY KEY|UNIQUE|
REFERENCES <имя таблицы> [(<имя столбца>)]
[<ссылочная спецификация>]| CHECK <предикат>
[[NOT] DEFERRABLE]
[INITIALLY IMMEDIATE|DEFERRED]
5) Ссылочная спецификация
Ссылочная спецификация (или декларативная целостность) отвечает за действия, выполняющиеся при попытке изменить значения родительского ключа, и подразумевает следующую конструкцию:
[MATCH FULL|PARTIAL] [ON UPDATE|DELETE
{CASCADE|SET NULL| SET DEFAULT|NO ACTION}]
6) Изменение структуры таблицы
ALTER TABLE <имя таблицы>
{ADD [COLUMN] <определение стобца>}|
{ALTER [COLUMN] <имя слолбца> SET DEFAULT
<значение по умолчанию>| DROP DEFAULT}|
{DROP [COLUMN] <имя столбца> CASCADE|RESTRICT}|
{ADD <ограничение таблицы>}
7) Удаление таблицы
DROP TABLE <имя таблицы> CASCADE|RESTRICT
Примечание:
RESTRICT – запрещает удалять таблицу, если на неё имеется ссылка в других объектах базы данных.
CASCADE – удаляются и все другие объекты, ссылающиеся на данную таблицу.
8) Ключевые слова
a) NOT NULL
Требуется обязательного указания данных в столбце в операторах INSERT и UPDATE.
b) PRIMARY KEY
Указывается при объявлении столбца или таблицы и требует уникальных значений в соответствующих столбцах, запрещая в них NULL – значения.
Ограничение на столбец отличается от аналогичного ограничения на таблицу отсутствием списка столбцов.
c) UNIQUE
Указывается при объявлении столбца или таблицы и требует уникальных значений в соответствующих столбцах, но NULL-значения в них разрешены и все строки с NULL-значениями считаются уникальными.
Ограничения на столбец отличается от аналогичного ограничения на таблицу отсутствием списка столбцов. Для двух или более столбцов запрещается повтор комбинаций значений. Вместе с ограничением NOT NULL определяет потенциальный ключ (CANDIDATE KET).
Для неидентифицируемой связи с NULLS ALLOWED PARENT KEY объявляется без NOT NULL. Тогда допустимы NULL-значения.
d) FOREIGN KEY
Требует совпадения значений внешнего ключа подчиненной таблицы соответствующим значениям PARENT KEY, в качестве которого указывают PRIMARY KEY или UNIQUE (возможно с NOT NULL) главной таблицы.
Допускает NULL-значения, если ссылается на UNIQUE.
Имена столбцов могут не совпадать с именами столбцов PARENT KEY, но должны быть совместимы.
e) REFERENCES
В подчиненной таблице при объявлении столбца или таблицы ссылается на PRIMARY KEY или UNIQUE (возможно с NOT NULL) главной таблицы.
Для PRIMARY KEY столбцы главной таблицы можно не указывать.
В операторе INSERT требует совпадения значений подчиненной таблицы значениям PARENT KEY главной таблицы.
В операторе DELETE запрещает удаление из главной таблицы, если есть ссылочные записи в подчиненной.
f) CHECK
Включает логическое выражение (предикат) для проверки значения в операторе INSERT. Причем предикат проверки таблицы может ссылаться на несколько таблиц, а предикат проверки столбца – несколько столбцов.
В обоих случаях возможны ложные отклонения условия, если предикат включает подзапрос.
g) MATCH FULL|PARTIAL
Определяет полное/частичное совпадение значений PRIMARY KEY и FOREIGN KEY. Фактически уточняется способ обработки NULL-значений в составе внешнего ключа. MARCH PARTIAL допускает NULL значения. Более того, возможны ситуации, когда одна строка из подчиненной таблицы может соответствовать нескольким строкам из главной таблицы (неуникальное совпадение), а одна строка в главной таблице может иметь несколько уникальных и несколько неуникальных строк в подчиненной таблице.
Уникальные и неуникальные строки по-разному исполняются в ссылочных спецификациях (ON DELETE|UPDATE). Игнорируется, если установлено ограничение NOT NULL.
h) CASCADE|NO ACTION
CASCADE – обеспечивает выполнение таких же изменений в FK, какие были сделаны в PK, но только в уникально совпадающих строках, т.е. когда установлено MATCH PARTIAL.
NO ACTION – не устанавливает автоматического изменения внешнего ключа.
i) SET NULL|DEFAULT
SET NULL – обеспечивает установку всех значений внешнего ключа в совпадающих строках равным NULL, но только в уникально совпадающих строках, т.е. когда установлено MATCH PARTIAL.
SET DEFAULT – обеспечивает установку всех значений внешнего ключа в совпадающих строках равными значениям по умолчанию, но только в уникально совпадающих строках, т.е. когда установлено MATCH PARTIAL.
9) Примеры объявления таблиц
a) CREATE TABLE SalesPeople(SNum Integer, SName Char(10), City Char(10), Comm Decimal)
b) CREATE TABLE SalesPeople(SNum Integer NOT NULL UNIQUE, SName Char(10) NOT NULL, City Char(10) DEFAULT ‘New York’, Comm Decimal CHECK (Comm <1)) c) CREATE TABLE SalesPeople(.., City Char(10) CHECK (City IN (‘London’, ‘New York’, ‘Bern’)), ..,) d) CREATE TABLE Customer (CNum Integer NOT NULL, CName Char(10) NOT NULL, City Char(10), Rating Integer, SNum Integer NOT NULL UNIQUE (CNum, SNum)) e) CREATE TABLE SalesPeople(SNum Integer NOT NULL, SName Char(10) NOT NULL, .., PRIMARY KEY (SNum, SName)) f) CREATE TABLE Customer(CNum Integer NOT NULL PRIMARY KEY, .., SNum Integer, FOREIGN KEY (SNum) REFERENCES SalesPeople(SNum)) g) CREATE TABLE Customer (CNum Integer NOT NULL PRIMARY KEY, .., SNum Integer, REFERENCES SalesPeople (SNum)) – Можно не указывать PK, если он из одного атрибута. h) CREATE TABLE Employee (EmpNo Integer NOT NULL PRIMARY KEY, Name Char(10) NOT NULL, Manager Integer REFERENCES Employee) – Manager допускает NULL, иначе нельзя добавить даже первую строку.