The total cost of all deliveries under the project should not exceed the project budget (the cost of one delivery is calculated as the product of the part price by the number of parts in this delivery).
How to validate that sum of prices of details in supplies with same projectId not more that project budget?
CREATE TABLE IF NOT EXISTS Details
(
Id Serial PRIMARY KEY,--Id детали (служебное поле, ключ, автоинкремент)
Name VARCHAR(255) NOT NULL,--Имя (текстовое, обязательное)
Price DOUBLE PRECISION NOT NULL, --Цена детали (текстовое, обязательное)
Check(Price>0), --Цена не может быть отрицательной
Color VARCHAR(255) NOT NULL, --Цвет детали (текстовое, обязательное)
Check(Color IN ('белый','черный','красный','синий','серый','зеленый',
'желтый','оранжевый','коричневый')),
--Цвет детали должен входить в фиксированный набор значений
Weight DOUBLE PRECISION NOT NULL,-- Вес детали В ГРАММАХ
--(дробное, обязательное)
Check(Weight>0.0)--Вес не может быть отрицательным
);
--Таблица 'Поставщики'
CREATE TABLE IF NOT EXISTS Suppliers
(
Id Serial PRIMARY KEY,--Id поставщика (служебное поле, ключ, автоинкремент)
Name VARCHAR(255) NOT NULL,--Название поставщика (текстовое, обязательное)
City VARCHAR(255) NOT NULL,--Город поставщика (текстовое, обязательное)
Address VARCHAR(255) NOT NULL DEFAULT 'Неизвестен',--Адрес поставщика
--(текстовое, обязательное)
Rating DOUBLE PRECISION NOT NULL,--Рейтинг (дробное, обязательное)
CHECK(Rating>=1.0 AND Rating <=10.0),--Рейтинг должен быть больше или равен 1
--и меньше или равен 10
Unique(Name,City)
);
--Таблица 'Проекты'
CREATE TABLE IF NOT EXISTS Projects
(
Id Serial PRIMARY KEY,--Id проекта (служебное поле, ключ, автоинкремент)
Name VARCHAR(255) NOT NULL,--Имя (текстовое, обязательное)
City VARCHAR(127) NOT NULL,
Address VARCHAR(255) NOT NULL,--Адрес (текстовое, обязательное)
Budget DOUBLE PRECISION NOT NULL,--Бюджет (дробное, обязательное)
CHECK(Budget>0.0)--Бюджет не может быть отрицательным
);
--Таблица 'Поставки'
CREATE TABLE IF NOT EXISTS Supplies
(
Id Serial PRIMARY KEY,--Id проекта (служебное поле, ключ, автоинкремент)
DetailId INT NOT NULL,--Id детали поставки (внешний ключ)
--(в одной поставке-одна деталь)
--(внешний ключ)
DetailQuantity SMALLINT NOT NULL, --Количество деталей(конкретной детали)
--в поставке
Check(DetailQuantity>0),--Количество деталей (конкретноц детали)
--в поставке не может быть отрицательным
ProjectId INT NOT NULL,--Id проекта (внешний ключ)
SupplierId INT NOT NULL,--Id поставщика (внешний ключ)
FOREIGN KEY(DetailId) REFERENCES Details(Id)
ON DELETE CASCADE ON UPDATE CASCADE,
--Удаляется деталь - удаляется поставка с деталью,
--Обновляется деталь - обновляется поставка с деталью
FOREIGN KEY(ProjectId) REFERENCES Projects(Id)
ON DELETE CASCADE ON UPDATE CASCADE,
--Удаляется проект - удаляется поставка в рамках проекта,
--Обновляется проект - обнавляется поставка в рамках проекта
FOREIGN KEY(SupplierId) REFERENCES Suppliers(Id)
ON DELETE CASCADE ON UPDATE CASCADE
--Удаляется деталь - удаляется поставка с деталью,
--Обновляется деталь - обновляется поставка с деталью
);