Я уже рассказал о создании таблиц, изменении количества столбцов, удалении таблиц. Теперь подошло время расказать про настройку полей в таблице, например, как указывать диапазон доступных значений для таблицы или нечто подобное.
При создании таблицы указывать диапазон допустимых значений. Если пользователь ввёл недопустимое значение, то программа просто отклонит это значение или сгенерирует ошибку. До сегодняшнего дня мы создавали таблицы, где мы опускали этот параметр и наши столбцы не имели органичений кроме типа и размера поля. Расмотрим общий случай:
CREATE TABLE Имя_Таблицы
(
Имя_Поля_1 Тип Ограничения,
Имя_Поля_2 Тип Ограничения,
);
Давай сразу создадим таблицу с двумя полями. Первое должно быть уникальным, а второе не должно содержать нулей:
CREATE TABLE NewTable
(
Name char (10) UNIQUE,
email char (10) NOT NULL
);
Таким образом мы создали таблицу с уникальным первым полем. Это позволяет нам использовать это поле в качестве уникального ключа, и за уникальностью будет следить сама база данных.
Для первичных ключей не нужно указывать уникальность, они уникальны от природы:
CREATE TABLE NewTable
(
Name char (10) NOT NULL PRIMARY KEY,
email char (10) NOT NULL UNIQUE
);
Единственное ограничение, которое я оставил - это NOT NULL. Его желательно оставить, потому что первичные ключи не могут быть пустыми. Пускай база данных следит за этим, хотя она и так будет следить. То, что второе поле я сделал уникальным и ненулевым, так это просто для красоты.
А если нам нужно создать таблицу, где комбинация из двух полей должна давать уникальность? Это значит, что в двух строках не может быть одинаковых значений двух определённых полей, например:
Поле1 Поле2
3 3
4 2
5 3
4 2
Если мы поставим уникальность по обоим полям, то во второй и четвёртой строке будет ошибка, оба поля имею одно и то же значение. Первая и третья строка не даст ошибки, потому что у них разное Поле1, хотя и Поле2 совпадает. Так как же задать ограничение сразу по двум столбцам?
CREATE TABLE NewTable
(
Name char (10) NOT NULL,
email char (10) NOT NULL,
Phone char (10),
UNIQUE (Name, email)
);
В этом примере я создаю таблицу с тремя полями и первые два из них являются уникальными. Точно так же ты можешь создать таблицу с первичным ключём из двух первых столбцов:
CREATE TABLE NewTable
(
Name char (10) NOT NULL,
email char (10) NOT NULL,
Phone char (10),
PRIMARY KEY (Name, email)
);
Помни, что большинство баз данных накладывает ограничение на первичный ключ - только первые и подряд идущие поля могут входить в первичный ключ.
Есть ещё одно интересное ключевое слово - CHECK, которое позволяет задать диапазон допустимых значений в поле, например:
CREATE TABLE NewTable
(
Name char (10) NOT NULL PRIMARY KEY,
email char (10) NOT NULL UNIQUE,
Age decimal CHECK (Age<110)
);
В этом примере я добавил поле Age (Возраст) типа decimal. После этого я поставил ключевое слово CHECK , которое задаёт ограничение. После этого я в скобках указал это ограничение, что поле Age должно быть меньше 110 (Я не думаю, что кто-то проживёт больше 110 лет, поэтому ограничил от ошибки). Теперь я усложню пример, сделав двойную проверку:
CREATE TABLE NewTable
(
Name char (10) NOT NULL PRIMARY KEY,
email char (10) NOT NULL UNIQUE,
Age decimal CHECK (Age<110 and Age>0)
);
В этом примере я сделал дополнительное ограничение. Теперь значение в поле Age должно быть больше 0 и меньше 100.
Есть ещё один тип ограничений - типа SQL оператора IN, который мы изучили уже давным давно.
CREATE TABLE NewTable
(
Name char (10) NOT NULL PRIMARY KEY,
email char (10) NOT NULL UNIQUE,
Age decimal CHECK (Age<110),
Town char(15) CHECK (Town in ('Moscow', 'Piter', 'Brest'))
);
Здесь мы используем знакомый оператор IN, который перечисляет допустимые значения для поля Town. Так можно использовать любые допустимые операторы сравнения SQL. Например, можно использовать знаки множественного выбора (маски) такие как _ (подчёркивание - заменяет одну любую букву) и % (процент - заменяет множество букв). Эти маски мы уже изучали, так что давай посмотрим пример:
CREATE TABLE NewTable
(
Name char (10) NOT NULL PRIMARY KEY,
email char (10) NOT NULL UNIQUE,
Age decimal CHECK (Age<110),
Town char(15) CHECK (Town in ('Moscow', 'Piter', 'Brest')),
DateB char(10) CHECK (DateB LIKE '__/__/____'),
Password char(10) CHECK (DateB LIKE 'RTY%')
);
Здесь я добавил два поля:
DateB (Дата рождения) - любое значение этого поля должно удовлетворять маске __/__/____
Password (Пароль) - пароль - слово, которое должно начинатся c трёх букв 'RTY'
Помимо ограничений, нам доступны для настройки и значения по умолчанию, за это отвечает слово DEFAULT:
CREATE TABLE NewTable
(
Name char (10) NOT NULL PRIMARY KEY,
email char (10) DEFAULT='@mail.ru',
Age decimal CHECK(Age<110),
Town char (15) DEFAULT='Moscow'
);
В этом примере я сразу двум полям задал значения по умолчанию.
Вот и всё, что косается ограничений. До следующего раза.