CREATE TABLE ZONA (
Nome VARCHAR(50) NOT NULL,
AreaCitta VARCHAR(100) NOT NULL,
TariffaOraria DECIMAL(5,2) NOT NULL,
PRIMARY KEY (Nome)
);
CREATE TABLE PARCHEGGIO (
IndirizzoGeografico VARCHAR(150) NOT NULL,
CapacitaMoto INT NOT NULL,
CapacitaAutomobile INT NOT NULL,
CapacitaCamion INT NOT NULL,
Categoria VARCHAR(10) NOT NULL,
H_apertura TIME,
H_chiusura TIME,
Zona VARCHAR(50),
PRIMARY KEY (IndirizzoGeografico),
FOREIGN KEY (Zona) REFERENCES ZONA(Nome),
CONSTRAINT CHK_Categoria_Parcheggio
CHECK (Categoria IN ('garage', 'aperto')),
CONSTRAINT CHK_Verifica_Orario
CHECK (
(Categoria = "garage" AND (H_apertura IS NOT NULL AND H_chiusura IS NOT NULL))
OR
(Categoria = "aperto" AND (H_apertura IS NULL AND H_chiusura IS NULL))
)
);
CREATE TABLE UTENTE (
CodiceFiscale CHAR(16) NOT NULL,
Nome VARCHAR(50) NOT NULL,
Cognome VARCHAR(50) NOT NULL,
NumTelefono VARCHAR(15),
Mail VARCHAR(100) NOT NULL,
Password VARCHAR(255) NOT NULL,
PRIMARY KEY (CodiceFiscale)
);
CREATE TABLE DIPENDENTE (
CodiceFiscale CHAR(16) NOT NULL,
Nome VARCHAR(50) NOT NULL,
Cognome VARCHAR(50) NOT NULL,
Ruolo VARCHAR(30) NOT NULL,
ParcheggioAssegnato VARCHAR(150),
PRIMARY KEY (CodiceFiscale),
FOREIGN KEY (ParcheggioAssegnato) REFERENCES PARCHEGGIO(IndirizzoGeografico),
CONSTRAINT CHK_Ruolo_Dipendente
CHECK (Ruolo IN ('operatore', 'controllore', 'addetto_amministrativo', 'responsabile')),
CONSTRAINT CHK_ParcheggioAssegnato
CHECK (
(Ruolo IN ('operatore', 'responsabile') AND ParcheggioAssegnato IS NOT NULL)
OR
(Ruolo IN ('controllore', 'addetto_amministrativo') AND ParcheggioAssegnato IS NULL)
)
);
CREATE TABLE VEICOLO (
Targa VARCHAR(10) NOT NULL,
Categoria VARCHAR(15) NOT NULL,
Utente CHAR(16) NOT NULL,
PRIMARY KEY (Targa),
FOREIGN KEY (Utente) REFERENCES UTENTE(CodiceFiscale),
CONSTRAINT CHK_Categoria_Veicolo
CHECK (Categoria IN ('moto', 'automobile', 'camion'))
);
CREATE TABLE ABBONAMENTO (
Utente CHAR(16) NOT NULL,
DataValidazione DATE NOT NULL,
DataScadenza DATE NOT NULL,
Tariffa DECIMAL(7,2) NOT NULL,
PRIMARY KEY (Utente, DataValidazione),
FOREIGN KEY (Utente) REFERENCES UTENTE(CodiceFiscale)
);
CREATE TABLE BIGLIETTO (
Utente CHAR(16) NOT NULL,
OraValidazione DATETIME NOT NULL,
OraScadenza DATETIME NOT NULL,
Tariffa DECIMAL(5,2) NOT NULL,
Zona VARCHAR(50) NOT NULL,
PRIMARY KEY (Utente, OraValidazione),
FOREIGN KEY (Utente) REFERENCES UTENTE(CodiceFiscale),
FOREIGN KEY (Zona) REFERENCES ZONA(Nome)
);
CREATE TABLE SOSTA (
Veicolo VARCHAR(10) NOT NULL,
Data DATE NOT NULL,
Hinizio TIME NOT NULL,
Hfine TIME,
Parcheggio VARCHAR(150) NOT NULL,
AbbonamentoUtente CHAR(16),
AbbonamentoData DATE,
BigliettoUtente CHAR(16),
BigliettoOra DATETIME,
PRIMARY KEY (Veicolo, Data, Hinizio),
FOREIGN KEY (Veicolo) REFERENCES VEICOLO(Targa),
FOREIGN KEY (Parcheggio) REFERENCES PARCHEGGIO(IndirizzoGeografico),
FOREIGN KEY (AbbonamentoUtente, AbbonamentoData) REFERENCES ABBONAMENTO(Utente, DataValidazione),
FOREIGN KEY (BigliettoUtente, BigliettoOra) REFERENCES BIGLIETTO(Utente, OraValidazione),
CONSTRAINT CHK_Sosta_Abbonamento
CHECK (
(AbbonamentoUtente IS NULL AND AbbonamentoData IS NULL)
OR
(AbbonamentoUtente IS NOT NULL AND AbbonamentoData IS NOT NULL)
),
CONSTRAINT CHK_Sosta_Biglietto
CHECK (
(BigliettoUtente IS NULL AND BigliettoOra IS NULL)
OR
(BigliettoUtente IS NOT NULL AND BigliettoOra IS NOT NULL)
),
CONSTRAINT CHK_Sosta_TitoloEsclusivo
CHECK (
(AbbonamentoUtente IS NOT NULL AND BigliettoUtente IS NULL)
OR
(AbbonamentoUtente IS NULL AND BigliettoUtente IS NOT NULL)
)
);
CREATE TABLE SANZIONE (
Veicolo VARCHAR(10) NOT NULL,
Data DATE NOT NULL,
Hinizio TIME NOT NULL,
Motivo VARCHAR(255) NOT NULL,
ImportoEuro DECIMAL(7,2) NOT NULL,
Dipendente CHAR(16) NOT NULL,
PRIMARY KEY (Veicolo, Data, Hinizio),
FOREIGN KEY (Veicolo, Data, Hinizio) REFERENCES SOSTA(Veicolo, Data, Hinizio),
FOREIGN KEY (Dipendente) REFERENCES DIPENDENTE(CodiceFiscale)
);
CREATE TABLE VALUTAZIONE (
Utente CHAR(16) NOT NULL,
DataValutazione DATE NOT NULL,
VotoPulizia INT NOT NULL,
VotoSicurezza INT NOT NULL,
Commento TEXT,
Parcheggio VARCHAR(150) NOT NULL,
PRIMARY KEY (Utente, DataValutazione),
FOREIGN KEY (Utente) REFERENCES UTENTE(CodiceFiscale),
FOREIGN KEY (Parcheggio) REFERENCES PARCHEGGIO(IndirizzoGeografico),
CONSTRAINT CHK_VotoPulizia
CHECK (VotoPulizia BETWEEN 1 AND 5),
CONSTRAINT CHK_VotoSicurezza
CHECK (VotoSicurezza BETWEEN 1 AND 5)
);
CREATE TABLE TURNO (
Dipendente CHAR(16) NOT NULL,
Data DATE NOT NULL,
Hinizio TIME NOT NULL,
Hfine TIME NOT NULL,
Parcheggio VARCHAR(150) NOT NULL,
PRIMARY KEY (Dipendente, Data, Hinizio),
FOREIGN KEY (Dipendente) REFERENCES DIPENDENTE(CodiceFiscale),
FOREIGN KEY (Parcheggio) REFERENCES PARCHEGGIO(IndirizzoGeografico)
);
CREATE TABLE SCONTO (
Tipo VARCHAR(20) NOT NULL,
DataInizio DATE NOT NULL,
DataFine DATE NOT NULL,
Percentuale DECIMAL(5,2) NOT NULL,
TitoloSosta VARCHAR(15) NOT NULL,
Utente CHAR(16),
Zona VARCHAR(50),
PRIMARY KEY (Tipo, DataInizio, DataFine, Percentuale, TitoloSosta),
FOREIGN KEY (Utente) REFERENCES UTENTE(CodiceFiscale),
FOREIGN KEY (Zona) REFERENCES ZONA(Nome),
CONSTRAINT CHK_Tipo_Sconto
CHECK (Tipo IN ('generico', 'legato a una zona')),
CONSTRAINT CHK_TitoloSosta
CHECK (TitoloSosta IN ('biglietto', 'abbonamento')),
CONSTRAINT CHK_Sconto_Zona
CHECK (
(Tipo = 'legato a una zona' AND Zona IS NOT NULL)
OR
(Tipo = 'generico' AND Zona IS NULL)
)
);
/* ============================================================================================================ */
INSERT INTO ZONA VALUES
('Centro', 'Centro Storico', 2.50),
('Crocetta', 'Crocetta', 2.00),
('San Salvario', 'San Salvario', 2.20),
('Lingotto', 'Lingotto', 1.80),
('Aurora', 'Aurora', 1.50);
INSERT INTO PARCHEGGIO VALUES
('Corso Vittorio Emanuele II 15', 80, 250, 20, 'garage', '07:00:00', '23:00:00', NULL),
('Via Nizza 230', 60, 180, 15, 'garage', '06:30:00', '22:30:00', NULL),
('Piazza Castello', 40, 150, 5, 'aperto', NULL, NULL, 'Centro'),
('Via Roma 45', 25, 100, 5, 'aperto', NULL, NULL, 'Centro'),
('Corso Regina Margherita 120', 35, 120, 10, 'aperto', NULL, NULL, 'Aurora'),
('Via Madama Cristina 85', 30, 90, 5, 'aperto', NULL, NULL, 'San Salvario'),
('Via Nizza 350', 20, 110, 10, 'aperto', NULL, NULL, 'Lingotto');
INSERT INTO UTENTE VALUES
('RSSMRC90A01L219X','Marco','Rossi','3331111111', 'marco.rossi@email.it','marco123'),
('BNCLCU88B12L219Y','Luca','Bianchi','3332222222', 'luca.bianchi@email.it','luca123'),
('FRRGIU95C41L219Z','Giulia','Ferrero',NULL, 'giulia.ferrero@email.it','giulia123'),
('GLLSRA97D52L219W','Sara','Gallo','3334444444', 'sara.gallo@email.it','sara123'),
('CNTNDR91E63L219V','Andrea','Conti','3335555555', 'andrea.conti@email.it','andrea123');
INSERT INTO DIPENDENTE VALUES
('RMNDVD80A01L219A','Davide','Romano', 'responsabile','Corso Vittorio Emanuele II 15'),
('SRAPLO82B11L219B','Paolo','Serra', 'operatore','Corso Vittorio Emanuele II 15'),
('VRDLGI83C21L219C','Luigi','Verdi', 'responsabile','Via Nizza 230'),
('FRRMRA86D31L219D','Maria','Ferri', 'operatore','Via Nizza 230'),
('GRCLNA89E41L219E','Elena','Greco', 'controllore',NULL),
('RVAMTA90F51L219F','Marta','Riva', 'controllore',NULL),
('VLLSTF84G61L219G','Stefano','Villa', 'addetto_amministrativo',NULL);
INSERT INTO VEICOLO VALUES
('AB123CD','automobile','RSSMRC90A01L219X'),
('EF456GH','moto','RSSMRC90A01L219X'),
('IJ789KL','automobile','BNCLCU88B12L219Y'),
('MN012OP','camion','FRRGIU95C41L219Z'),
('QR345ST','automobile','GLLSRA97D52L219W'),
('UV678WX','moto','CNTNDR91E63L219V'),
('YZ901AA','automobile','CNTNDR91E63L219V');
INSERT INTO ABBONAMENTO VALUES
('RSSMRC90A01L219X','2026-01-01','2026-12-31',420.00),
('BNCLCU88B12L219Y','2026-03-01','2027-02-28',380.00),
('CNTNDR91E63L219V','2026-02-15','2027-02-14',390.00);
INSERT INTO BIGLIETTO VALUES
('FRRGIU95C41L219Z', '2026-07-01 08:00:00', '2026-07-01 12:00:00', 8.00, 'Centro'),
('GLLSRA97D52L219W', '2026-07-01 09:30:00', '2026-07-01 13:30:00', 8.80, 'Centro'),
('FRRGIU95C41L219Z', '2026-07-02 10:00:00', '2026-07-02 15:00:00', 7.50, 'Aurora'),
('CNTNDR91E63L219V', '2026-07-03 08:30:00', '2026-07-03 11:30:00', 5.40, 'Lingotto');
INSERT INTO SCONTO VALUES
('generico', '2026-01-01', '2026-12-31', 10.00, 'biglietto', NULL, NULL),
('legato a una zona', '2026-06-01', '2026-08-31', 20.00, 'biglietto', NULL, 'Centro'),
('generico', '2026-01-01', '2026-12-31', 15.00, 'abbonamento', NULL, NULL);
INSERT INTO TURNO VALUES
('GRCLNA89E41L219E', '2026-07-01', '08:00:00', '16:00:00', 'Piazza Castello'),
('RVAMTA90F51L219F', '2026-07-01', '09:00:00', '17:00:00', 'Via Roma 45'),
('GRCLNA89E41L219E', '2026-07-02', '08:00:00', '16:00:00', 'Corso Regina Margherita 120'),
('RVAMTA90F51L219F', '2026-07-03', '08:00:00', '16:00:00', 'Via Nizza 350');
INSERT INTO SOSTA VALUES
('AB123CD', '2026-07-01', '08:30:00', '11:00:00',
'Corso Vittorio Emanuele II 15', 'RSSMRC90A01L219X', '2026-01-01', NULL, NULL),
('IJ789KL', '2026-07-01', '09:15:00', '12:30:00',
'Via Nizza 230', 'BNCLCU88B12L219Y', '2026-03-01', NULL, NULL),
('MN012OP', '2026-07-01', '08:15:00', '11:45:00',
'Piazza Castello', NULL, NULL, 'FRRGIU95C41L219Z', '2026-07-01 08:00:00'),
('QR345ST', '2026-07-01','10:00:00', '12:00:00',
'Via Roma 45', NULL, NULL, 'GLLSRA97D52L219W', '2026-07-01 09:30:00'),
('UV678WX', '2026-07-03', '09:00:00', '11:00:00',
'Via Nizza 350', 'CNTNDR91E63L219V', '2026-02-15', NULL, NULL),
('YZ901AA', '2026-07-03', '08:45:00', '10:30:00',
'Via Nizza 350', NULL, NULL, 'CNTNDR91E63L219V', '2026-07-03 08:30:00');
INSERT INTO VALUTAZIONE VALUES
('RSSMRC90A01L219X', '2026-07-01', 5, 5,
'Garage molto pulito e personale disponibile.', 'Corso Vittorio Emanuele II 15'),
('BNCLCU88B12L219Y', '2026-07-01', 4, 5,
'Garage ordinato e sicuro.', 'Via Nizza 230'),
('FRRGIU95C41L219Z', '2026-07-02', 4, 3,
'Parcheggio comodo ma poco illuminato.', 'Piazza Castello'),
('GLLSRA97D52L219W', '2026-07-02', 5, 4,
'Molto facile trovare posto.', 'Via Roma 45'),
('CNTNDR91E63L219V', '2026-07-03', 4, 4,
'Comodo per raggiungere il Lingotto.', 'Via Nizza 350');
INSERT INTO SANZIONE VALUES
('MN012OP', '2026-07-01', '08:15:00',
'Titolo di sosta scaduto', 42.50, 'GRCLNA89E41L219E'),
('QR345ST', '2026-07-01', '10:00:00',
'Mancata esposizione del titolo di sosta', 29.00, 'RVAMTA90F51L219F');
DELETE FROM UTENTE
WHERE CodiceFiscale = 'RSSMRC90A01L219X';
DELETE FROM VEICOLO
WHERE Targa = 'AB123CD';
DELETE FROM PARCHEGGIO
WHERE IndirizzoGeografico = 'Corso Vittorio Emanuele II 15';
DELETE FROM ZONA
WHERE Nome = 'Centro';
UPDATE UTENTE
SET CodiceFiscale = 'AAAAAAAAAAAAAAAA'
WHERE CodiceFiscale = 'RSSMRC90A01L219X';
UPDATE VEICOLO
SET Targa = 'ZZ999ZZ'
WHERE Targa = 'AB123CD';
UPDATE PARCHEGGIO
SET IndirizzoGeografico = 'Via Nuova 100'
WHERE IndirizzoGeografico = 'Via Nizza 230';
UPDATE VEICOLO
SET Categoria = 'bicicletta'
WHERE Targa = 'AB123CD';
UPDATE PARCHEGGIO
SET Categoria = 'garage'
WHERE IndirizzoGeografico = 'Piazza Castello';
UPDATE DIPENDENTE
SET Ruolo = 'direttore'
WHERE CodiceFiscale = 'SRAPLO82B11L219B';
INSERT INTO SCONTO
VALUES (
'legato a una zona',
'2026-10-01',
'2026-10-31',
20,
'biglietto',
NULL,
NULL
);
/* stesso abbonamento usato in soste sovrapposte */
INSERT INTO SOSTA
VALUES (
'EF456GH',
'2026-07-03',
'09:30:00',
'10:30:00',
'Corso Vittorio Emanuele II 15',
'RSSMRC90A01L219X',
'2026-01-01',
NULL,
NULL
);
/* sia biglietto che abbonamento */
INSERT INTO SOSTA
VALUES (
'AB123CD',
'2026-07-10',
'08:00:00',
'10:00:00',
'Corso Vittorio Emanuele II 15',
'RSSMRC90A01L219X',
'2026-01-01',
'FRRGIU95C41L219Z',
'2026-07-01 08:00:00'
);
/* garage senza orari */
UPDATE PARCHEGGIO
SET
H_apertura = NULL,
H_chiusura = NULL
WHERE IndirizzoGeografico = 'Via Nizza 230';
/* voto fuori intervallo */
UPDATE VALUTAZIONE
SET VotoPulizia = 8
WHERE Utente = 'RSSMRC90A01L219X'
AND DataValutazione = '2026-07-01';
To embed this project on your website, copy the following code and paste it into your website's HTML: