Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теоретические основы реляционных баз данных. Учебное пособие.pdf
Скачиваний:
0
Добавлен:
15.08.2026
Размер:
936 Кб
Скачать

 

 

 

 

- 44 -

 

 

 

Чертков

|Максим

| 344

| 4.31

| м

|

Дубоделов

|Андрей

|

345

| 4.87

|

м

|

Макаркина

|Надежда|

344

|

|

ж

|

(9 rows)

 

 

 

 

 

 

 

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

ALTER TABLE students

RENAME COLUMN st_ticket TO ticket; ALTER TABLE

ALTER TABLE students

ALTER COLUMN ticket TYPE VARCHAR(10); ALTER TABLE

ALTER TABLE students DROP COLUMN ticket;

ALTER TABLE

Можно удалить и всю таблицу целиком:

DROP TABLE students; DROP TABLE

SELECT * FROM students ;

ERROR: relation "students" does not exist LINE 1: SELECT * FROM students

Здесь мы видим, что более такой таблицы не существует в базе данных и запрос к ней вызывает ошибку, о которой нам сообщает сервер базы данных.

2.8. Ограничение данных

Ограничения - это часть определений таблицы, вводящая ограничения на значения, которые вы можете вводить в столбцы. До этого места единственными ограничениями на значения, которые вы могли вводить, были тип данных и размер вводимых значений, которые должны быть совместимы с теми столбцами, куда эти значения помещаются (как определено для команды CREATE TABLE или команды ALTER TABLE).

2.8.1. Ограничение таблиц

При создании таблицы можно задавать ограничения на значения полей и SQL будет отклонять любые значения, противоречащие заданным ограничениям. Имеются ограничения таблицы и ограничения столбца.

- 45 -

Ограничения столбца вставляются в операторы CREATE TABLE и ALTER TABLE в конце имени столбца после типа данных, но перед запятой, в то время как ограничения таблицы указываются после последнего столбца перед заключительной круглой скобкой.

На примере рассмотрим создание таблицы с данными о студентах, в которой запрещено вставлять строки, в которых отсутствует информация о фамилиях и именах студентов:

CREATE TABLE IF NOT EXISTS students ( family varchar(20) NOT NULL,

name varchar(15) NOT NULL, stgroup varchar(5),

gpa numeric(3,2), sex char(1));

CREATE TABLE

Теперь попробуем добавить новую запись с пустым значением поля, содержащего информацию об имени студента:

INSERT INTO students

VALUES ('Овсиенко',NULL,'345',NULL,'ж');

ERROR: null value in column "name" violates not-null constraint

DETAIL: Failing row contains (Овсиенко, null, 345, null, ж).

Обратим внимание, что при вставке были заданы два пустых значения, но ошибка была только для поля name.

Теперь рассмотрим требование уникальности на уровне столбца. В примере мы можем потребовать, чтобы в таблице не было студентов с одинаковой фамилией (требование неправильное, но показательное):

CREATE TABLE students (

family varchar(20) NOT NULL UNIQUE, name varchar(15),

stgroup varchar(5), gpa numeric(3,2), sex char(1));

CREATE TABLE

Попробуем ввести данные о студенте Балашове, обратив внимание на то, что у него все остальные данные (кроме пола) отличаются и дублируется только фамилия:

INSERT INTO nstudents

VALUES ('Балашов','Петр','345',4.45,'м');

ERROR: duplicate key value violates unique constraint "nstudents_family_key"

DETAIL: Key (family)=(Балашов) already exists.

- 46 -

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

— фамилии и имени:

CREATE TABLE IF NOT EXISTS nstudents ( family varchar(20),

name varchar(15), stgroup varchar(5), gpa numeric(3,2), sex char(1),

UNIQUE (family, name));

CREATE TABLE

Теперь попробуем снова ввести данные о студенте Балашове Петре:

INSERT INTO students

VALUES ('Балашов','Петр','345',4.45,'м');

INSERT 0 1

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

INSERT INTO students

VALUES ('Балашов','Андрей','342',5.00,'м');

ERROR: duplicate key value violates unique constraint "nstudents_family_name_key"

DETAIL: Key (family, name)=(Балашов, Андрей) already

exists.

Ограничение CHECK состоит из ключевого слова CHECK, сопровождаемого предложением предиката, который использует указанное поле. Любая попытка модифицировать или вставить значение поля, которое могло бы сделать этот предикат неверным, будет отклонена.

Допустим, средний балл не может быть больше 5.00:

CREATE TABLE IF NOT EXISTS students ( family varchar(20),

name varchar(15), stgroup varchar(5),

gpa numeric(3,2) CHECK (gpa <= 5), sex char(1),

UNIQUE (family, name));

CREATE TABLE

Теперь попробуем ввести новую запись со значением среднего балла, превышающим заданное ограничение:

INSERT INTO nstudents

VALUES ('Косымскова','Светлана','345',5.04,'ж');

- 47 -

ERROR: new row for relation "nstudents" violates check constraint "nstudents_gpa_check"

DETAIL: Failing row contains (Косымскова, Светлана, 345,

5.04, ж).

Теперь ограничим возможность для ввода записей только теми, у которых в сведениях о студентах группа может принимать значения из определенного набора:

CREATE TABLE students ( family varchar(20), name varchar(15), stgroup varchar(5)

CHECK (stgroup IN ('342','344','345')), gpa numeric(3,2),

sex char(1),

UNIQUE (family, name));

CREATE TABLE

Попытка ввести данные о студентах из других групп, кроме 342, 344 и 345, приведет к следующему результату:

INSERT INTO students

VALUES ('Косымскова','Светлана','346',4.04,'ж'); ERROR: new row for relation "students" violates check constraint "students_stgroup_check"

DETAIL: Failing row contains (Косымскова, Светлана, 346, 4.04, ж).

Допустимо формировать условия, которые базируются на нескольких полях: так, в следующем примере будет проверяться принадлежность студента к одной из групп - 342, 344 или 345 и одновременно средний балл должен не превышать 5.

CREATE TABLE IF NOT EXISTS nstudents ( family varchar(20),

name varchar(15), stgroup varchar(5), gpa numeric(3,2), sex char(1),

UNIQUE (family, name),

CHECK (stgroup IN ('342','344','345') OR gpa <= 5)); CREATE TABLE

2.8.2. Установка значений по умолчанию

Когда вы вставляете строку в таблицу без указания в ней значений для каждого поля, SQL должен иметь значение по умолчанию для включения его в определённое поле или же команда будет

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