diff --git a/lab7.sql b/lab7.sql new file mode 100644 index 0000000..3c199a7 --- /dev/null +++ b/lab7.sql @@ -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;