PostgreSQl. Ограничение(функция) неверна. Как реализовать такое ограничение
Ненадежный (Rating<6.0) поставщик не может поставлять дорогие (Price>1000.0) детали.
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
--Удаляется деталь - удаляется поставка с деталью,
--Обновляется деталь - обновляется поставка с деталью
);
CREATE OR REPLACE FUNCTION Suppliers_And_Details_On_Insert_Supplies_Validate() RETURNS trigger AS $Suppliers_And_Details_On_Insert_Supplies_Validate$
BEGIN
IF (Rating < 6.0 AND Price>1000)
THEN
RAISE EXCEPTION 'Unreliable supplier cannot supply an expensive detail';
END IF;
RETURN NEW;
END;
$Suppliers_And_Details_On_Insert_Supplies_Validate$ LANGUAGE plpgsql;
CREATE TRIGGER supplies_validate BEFORE INSERT OR UPDATE ON Supplies
FOR EACH ROW EXECUTE PROCEDURE Suppliers_And_Details_On_Insert_Supplies_Validate();
INSERT INTO Supplies(DetailId,DetailQuantity,ProjectId,SupplierId)
Values
(1,500,1,1),(2,1000,2,2)...;
Rating - рейтинг поставщика (Suppliers) (связанная с Supplies таблица) в диапазоне от 1 до 10 включительно. Price - Цена детали (Details) (связанная с Supplies таблица). Ненадежные (Suppliers.Rating<6.0) поставщики не могут поставлять дорогие (Details.Price>1000) детали. On Insert, On Update Trigger.