
CREATE TABLE Studente (
Matricola char(6) PRIMARY KEY,
CodiceFiscale char(16) UNIQUE NOT NULL,
DataNascita Date NOT NULL CHECK(DataNascita>='1/1/1900'),
Città varchar(255),
Rappresentanre boolean NOT NULL DEFAULT False,
)
CREATE TABLE Esame (
CodiceCorso char(5) REFERENCES Corso(Codice) ON UPDATE CASCADE ON DELETE NO ACTION,
MatricolaStudente char(6) REFERENCES Studente(Matricola) ON UPDATE CASCADE ON DELETE NO ACTION
Voto integer NOT NULL CHECK (Voto between 18 and 31) ,
PRIMARY KEY (CodiceCorso, MatricolaStudente)
)

CREATE TABLE Corso (
CodCorso VARCHAR(255), PRIMARY KEY,
Descrizione varchar(255) NOT NULL,
Tipo ENUM ('Monosettimanale', 'Bisettimanale') NOT NULL,
DataInizio Date NOT NULL,
DataFine Date NOT NULL
)
CREATE TABLE Frequenza (
CodiceCorso varchar(255),
Vasca Varchar(255),
Giorno Date,
OraInizio Time,
Cliente CHAR(16) REFERENCES Persona(CF) ON UPDATE CASCADE ON DELETE NO ACTION,
DataDiIscrizione DATE NOT NULL,
PRIMARY KEY (CodiceCorso, Vasca, Giorno, OraInizio, Cliente),
FOREIGN KEY (CodiceCorso, Vasca, Giorno, OraInizio) REFERENCES
Calendario(CodiceCorso, Vasca, Giorno, OraInizio)
ON UPDATE CASCADE ON DELETE NO ACTION
)
Sono vincoli di integrità generici della nostra base di dati.

Punto 3
Non devono esistere casi in cui la data di iscrizione sia posteriore alla data di fine corso
Sintassi
WHERE [not] exists sub_query
------------------------------
CREATE ASSERTION VerificaDate CHECK (
NOT EXISTS (
SELECT *
FROM Frequenza, Corso
WHERE CodiceCorso = CodCorso AND DataIscrizione > DataFine
)
La logica per le asserzioni è scrivere dei check in cui imponiamo che non esista mai il comportamento che non vogliamo.
Punto 4
Specificare il vincolo che controlla che in uno stesso giorno non ci siano più di 50 persone che frequentano le lezioni.