Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
226 changes: 226 additions & 0 deletions lab7.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,226 @@
--Лабораторная работа 7. Создание ограничений целостности
--Работайте с БД <НаименованиеПрограммыОбучения>_<ВашаФамилия>.
--
-- Задание 1.
-- Создайте в схеме schema1 таблицу countries (справочник стран) и приведите код:
-- 1. Таблица должна содержать следующие поля: country_id, country_name и region_id. Выберите для данных столбцов подходящие типы данных

CREATE TABLE IF NOT EXISTS schema1.countries (
country_id smallint NOT NULL,
country_name varchar(50) NOT NULL,
region_id smallint NOT NULL
);

-- 2. Необходимо гарантировать, что в таблицу не будут введены никакие страны, кроме России, Индии, Китая, Бразилии, Казахстана, Киргизии и Белоруссии.

ALTER TABLE schema1.countries
ADD CONSTRAINT countries_country_name_chk
CHECK (country_name IN (
'Россия','Индия','Китай','Бразилия','Казахстан','Киргизия','Белоруссия'
));

-- 3. Столбец country_id должен быть ключевым столбцом таблицы. Значения в столбце должны вычисляться автоматически, начиная с 1 с шагом 2.

ALTER TABLE schema1.countries
ALTER COLUMN country_id ADD GENERATED BY DEFAULT AS IDENTITY (START WITH 1 INCREMENT BY 2);
ALTER TABLE schema1.countries
ADD CONSTRAINT countries_pk PRIMARY KEY (country_id);

-- 4. Значения комбинации столбцов country_id и region_id должны быть уникальными.

ALTER TABLE schema1.countries
ADD CONSTRAINT countries_country_region_uk UNIQUE (country_id, region_id);

-- 5. Удалите ограничение на перечень допустимых стран

ALTER TABLE schema1.countries
DROP CONSTRAINT IF EXISTS countries_country_name_chk;

-- 6. Удалите столбец region_id

ALTER TABLE schema1.countries DROP CONSTRAINT IF EXISTS countries_country_region_uk;
ALTER TABLE schema1.countries DROP COLUMN IF EXISTS region_id;

-- Задание 2.
-- Создайте в схеме schema1 таблицу locations (справочник адресов) со следующей структурой и приведите код:
-- Поле Тип
-- location_id numeric(4,0)
-- street_address character varying(40)
-- postal_code character varying(6)
-- city character varying(30)
-- country_id ?

CREATE TABLE IF NOT EXISTS schema1.locations (
location_id smallint,
street_address varchar(40),
postal_code varchar(6),
city varchar(30) NOT NULL,
country_id smallint NOT NULL
);

-- 1. Создайте в таблице locations составной первичный ключ на основе столбцов location_id и country_id.

ALTER TABLE schema1.locations
ADD CONSTRAINT locations_pk PRIMARY KEY (location_id, country_id);

-- 2. Добавьте ограничение на столбец postal_code, запрещающее ввод нечисловых значений.

ALTER TABLE schema1.locations
ADD CONSTRAINT locations_postal_code_chk
CHECK (postal_code IS NULL OR postal_code ~ '^[0-9]+$');

-- 3. Столбец country_id должен содержать только те значения, которые существуют в таблице countries в столбце country_id.

ALTER TABLE schema1.locations
ADD CONSTRAINT locations_country_fk
FOREIGN KEY (country_id)
REFERENCES schema1.countries(country_id)
ON UPDATE RESTRICT
ON DELETE RESTRICT;

-- 4. Выведите столбец country_id из состава первичного ключа.

ALTER TABLE schema1.locations DROP CONSTRAINT IF EXISTS locations_pk;
ALTER TABLE schema1.locations
ADD CONSTRAINT locations_pk PRIMARY KEY (location_id);

-- Задание 3.
-- Создайте в схеме schema1 таблицу departments (справочник офисов) со следующей структурой и приведите код:
-- Поле Тип данных Ограничения
-- department_id numeric(4,0) not null
-- department_name character varying(30) not null
-- manager_id numeric(6,0) not null
-- location_id numeric(4,0) default null::numeric

CREATE TABLE IF NOT EXISTS schema1.departments (
department_id numeric(4,0) NOT NULL,
department_name varchar(30) NOT NULL,
manager_id numeric(6,0) NOT NULL,
location_id numeric(4,0) DEFAULT NULL::numeric
);

-- 1. Создайте в таблице составной первичный ключ – (department_id, manager_id)

ALTER TABLE schema1.departments
ADD CONSTRAINT departments_pk PRIMARY KEY (department_id, manager_id);

-- 2. Убедитесь, что автоматически был создан индекс

SELECT * FROM pg_indexes WHERE schemaname = 'schema1' AND tablename = 'departments';

-- Задание 4.
-- Создайте в схеме schema1 таблицу jobs (справочник должностей) и приведите код:
-- 1. Таблица должна содержать следующие поля: job_id, job_title, min_salary и max_salary. Выберите для данных столбцов подходящие типы данных

CREATE TABLE IF NOT EXISTS schema1.jobs (
job_id varchar(10) NOT NULL,
job_title varchar(50) NOT NULL,
min_salary numeric(8,2) NOT NULL,
max_salary numeric(8,2) NOT NULL
);

-- 2. Значение в поле max_salary не должно превышать 25000

ALTER TABLE schema1.jobs
ADD CONSTRAINT jobs_max_salary_chk CHECK (max_salary <= 25000);

-- 3. Значение по умолчанию для job_title – строка нулевой длины

ALTER TABLE schema1.jobs
ALTER COLUMN job_title SET DEFAULT '';

-- 4. Значение по умолчанию для min_salary - равно 8000

ALTER TABLE schema1.jobs
ALTER COLUMN min_salary SET DEFAULT 8000;

-- 5. Дублирование данных в столбце job_id не допускается

ALTER TABLE schema1.jobs
ADD CONSTRAINT jobs_pk PRIMARY KEY (job_id);

-- 6. В таблице jobs измените значение по умолчанию для столбца min_salary – 7500

ALTER TABLE schema1.jobs
ALTER COLUMN min_salary SET DEFAULT 7500;

-- Задание 5.
-- Создайте в схеме schema1 таблицу employees (список сотрудников) со следующей структурой и приведите код:
-- Поле Тип данных Ограничения
-- employee_id decimal(6,0) Первичный ключ
-- first_name varchar(20) NULL
-- last_name varchar(25) NOT NULL
-- email varchar(25) NOT NULL
-- phone_number varchar(20) NULL, соответствие шаблону 8(ХХХ)ХХХ-ХХХХ
-- hire_date date NOT NULL, меньше или равно текущая дата
-- job_id varchar(10) NOT NULL
-- salary decimal(8,2) NULL
-- manager_id decimal(6,0) NULL
-- department_id decimal(4,0) NULL

CREATE TABLE IF NOT EXISTS schema1.employees (
employee_id numeric(6,0) NOT NULL,
first_name varchar(20),
last_name varchar(25) NOT NULL,
email varchar(25) NOT NULL,
phone_number varchar(20),
hire_date date NOT NULL,
job_id varchar(10) NOT NULL,
salary numeric(8,2),
manager_id numeric(6,0),
department_id numeric(4,0),
CONSTRAINT employees_phone_chk CHECK (
phone_number IS NULL OR phone_number ~ '^8\([0-9]{3}\)[0-9]{3}-[0-9]{4}$'
),
CONSTRAINT employees_hire_date_chk CHECK (hire_date <= CURRENT_DATE)
);

-- 1. Столбец employee_id – Первичный ключ таблицы.
-- a. При вводе данных пользователь должен иметь возможность изменять гранулярность проверки ограничения на уровне транзакции.

ALTER TABLE schema1.employees
ADD CONSTRAINT employees_pk PRIMARY KEY (employee_id) DEFERRABLE INITIALLY IMMEDIATE;

-- 2. Столбец job_id должен содержать только те значения, которые существуют в таблице jobs в столбце job_id.
-- a. При удалении записей в таблице jobs соответствующие записи в таблице employee должны автоматически удаляться

ALTER TABLE schema1.employees
ADD CONSTRAINT employees_job_fk
FOREIGN KEY (job_id)
REFERENCES schema1.jobs(job_id)
ON DELETE CASCADE
ON UPDATE RESTRICT;

-- b. Любые изменения первичного ключа в таблице jobs должны отклоняться, если существуют связные записи в таблице employees

-- Реализовано в ограничении выше через ON UPDATE RESTRICT.

-- 3. Столбцы department_id и manager_id являются столбцами составного внешнего ключа, ссылающимися на соответствующий ключ в таблице «departments».

ALTER TABLE schema1.employees
ADD CONSTRAINT employees_dept_mgr_fk
FOREIGN KEY (department_id, manager_id)
REFERENCES schema1.departments(department_id, manager_id)
ON UPDATE RESTRICT
ON DELETE RESTRICT;

-- Задание 6.
-- 1. В таблице departments измените состав первичного ключа – ключ должен состоять ТОЛЬКО из столбца department_id.

ALTER TABLE schema1.departments DROP CONSTRAINT IF EXISTS departments_pk CASCADE;
ALTER TABLE schema1.departments
ADD CONSTRAINT departments_pk PRIMARY KEY (department_id);

-- 2. Внесите изменения в состав внешнего ключа в таблице employees, ссылающийся на соответствующий ключ в таблице departments.

ALTER TABLE schema1.employees DROP CONSTRAINT IF EXISTS employees_dept_mgr_fk;
ALTER TABLE schema1.employees
ADD CONSTRAINT employees_dept_fk
FOREIGN KEY (department_id)
REFERENCES schema1.departments(department_id)
ON UPDATE RESTRICT
ON DELETE RESTRICT;

-- 3. Удалите столбец manager_id из состава таблицы employees

ALTER TABLE schema1.employees DROP COLUMN IF EXISTS manager_id;