Skrypt SQL
DROP TABLE IF EXISTS Historia CASCADE;
DROP TABLE IF EXISTS Artysci_Eksponaty CASCADE;
DROP TABLE IF EXISTS Eksponaty CASCADE;
DROP TABLE IF EXISTS Artysci CASCADE;
DROP TABLE IF EXISTS Galerie CASCADE;
DROP TABLE IF EXISTS Instytucje CASCADE;
CREATE TABLE Eksponaty (
id serial PRIMARY KEY,
tytul varchar(20) NOT NULL,
typ varchar(10) NOT NULL,
wysokosc_cm smallint CHECK (wysokosc_cm > 0),
szerokosc_cm smallint CHECK (szerokosc_cm > 0),
waga_dag integer CHECK (waga_dag > 0)
);
CREATE TABLE Artysci (
id serial PRIMARY KEY,
nazwisko varchar(30) NOT NULL,
rok_urodzenia date NOT NULL,
rok_zgonu date,
CONSTRAINT chk_rok_zgonu CHECK (rok_zgonu IS NULL OR rok_zgonu > rok_urodzenia)
);
CREATE TABLE Artysci_Eksponaty (
id serial PRIMARY KEY,
id_artysta integer NOT NULL REFERENCES Artysci,
id_eksponat integer NOT NULL REFERENCES Eksponaty(id) ON DELETE CASCADE
);
CREATE TABLE Galerie (
id serial PRIMARY KEY,
nazwa varchar(20) NOT NULL
);
CREATE TABLE Instytucje (
id serial PRIMARY KEY,
nazwa varchar(50) NOT NULL,
miasto varchar(20) NOT NULL
);
CREATE TABLE Historia (
id serial PRIMARY KEY,
eksponat_id integer NOT NULL REFERENCES Eksponaty(id) ON DELETE CASCADE,
instytucja_id integer REFERENCES Instytucje,
galeria_id integer REFERENCES Galerie,
czy_magazyn boolean NOT NULL,
od date,
"do" date,
-- Warunek: różnica ("do" - od) nie może przekraczać 30 dni dla wypożyczenia do instytucji
CHECK (
instytucja_id IS NULL
OR
(
od IS NULL
OR "do" IS NULL
OR ("do" - od) <= 30
)
)
);
-- Usuwanie artysty jeśli po usunięciu wpisu z Artysci_Eksponaty nie ma już przypisanych eksponatów
CREATE OR REPLACE FUNCTION delete_artysta_if_no_eksponaty()
RETURNS trigger AS $$
BEGIN
IF NOT EXISTS (
SELECT 1
FROM Artysci_Eksponaty
WHERE id_artysta = OLD.id_artysta
) THEN
DELETE FROM Artysci WHERE id = OLD.id_artysta;
END IF;
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER trg_delete_artysta
AFTER DELETE ON Artysci_Eksponaty
FOR EACH ROW
EXECUTE FUNCTION delete_artysta_if_no_eksponaty();
Pobierz skrypt
Powrót