PDA

Visualizza la versione completa : SQL - conferma per integrità referenziale


gabama
18-12-2009, 22:31
CREATE TABLE persona
(
matr character(4) NOT NULL,
cognome character(40) NOT NULL,
nome character(40) NOT NULL,
"Eta" integer DEFAULT 0,
"Luogo_nascita" character(20),
CONSTRAINT pk_persona PRIMARY KEY (matr)
)



CREATE TABLE telefono
(
ntelefono character(12) NOT NULL,
matr character(4),
"Luogo_tel" character(20),
CONSTRAINT pk_telefono PRIMARY KEY (ntelefono),
CONSTRAINT fk_telefono FOREIGN KEY (matr)
REFERENCES persona (matr) MATCH FULL
ON UPDATE CASCADE ON DELETE SET NULL
)



è corretto fare in questo modo per creare un vincolo di integrità referenziale (per creare una relazione uno a molti) ,tra persone e telefono?
Grazie in anticipo

YuYevon
19-12-2009, 10:44
Una persona può avere più numeri di telefono ma ogni numero di telefono appartiene ad una sola persona, giusto? Direi che è fatto bene.

gabama
19-12-2009, 10:58
perfetto,grazie!

gabama
19-12-2009, 12:49
ho ancora un dubbio su un altra cosa,ho postato qui per evitare di fare un doppio messaggio,perchè l' argomento è lo stesso

In un db su Aereoporti,ho collegato la città di partenza e di arrivo di volo con città di aereoporto.E' corretto così?Inoltre che campo devo mettere,(di Postgresql) per mettere ora arrivo e partenza (es.22.45)
Graze mille in anticipo



CREATE TABLE aereo
(
tipoaereo character(40) NOT NULL,
numpasseggeri integer NOT NULL,
qtamerci integer NOT NULL,
CONSTRAINT pk_aereo PRIMARY KEY (tipoaereo)
)

CREATE TABLE aereoporto
(
citta character(40) NOT NULL,
nazione character(40) NOT NULL,
numpiste integer NOT NULL,
CONSTRAINT pk_aereoporto PRIMARY KEY (citta)
)

CREATE TABLE volo
(
idvolo integer NOT NULL,
giornosett character(15) NOT NULL,
cittapart character(40) NOT NULL,
orapart integer NOT NULL,
cittaarr character(40) NOT NULL,
oraarr integer NOT NULL,
tipo_aereo character(40) NOT NULL,
CONSTRAINT pk_volo PRIMARY KEY (idvolo, giornosett),
CONSTRAINT fk_volo FOREIGN KEY (cittapart)
REFERENCES aereoporto (citta) MATCH FULL
ON UPDATE CASCADE ON DELETE SET NULL,
CONSTRAINT fk_volo2 FOREIGN KEY (cittaarr)
REFERENCES aereoporto (citta) MATCH FULL
ON UPDATE CASCADE ON DELETE SET NULL,
CONSTRAINT fk_volo3 FOREIGN KEY (tipo_aereo)
REFERENCES aereo (tipoaereo) MATCH FULL
ON UPDATE CASCADE ON DELETE NO ACTION
)

YuYevon
19-12-2009, 13:56
Originariamente inviato da gabama
In un db su Aereoporti,ho collegato la città di partenza e di arrivo di volo con città di aereoporto.E' corretto così?


Quando hai una relazione 1:N devi sempre mettere la chiave esterna nella tabella "dalla parte di N". Non è proprio obbligatorio, ma decisamente consigliabile. Inoltre, la chiave esterna deve referenziare la chiave primaria della tabella con cui si vuole creare la relazione. Tu hai fatto proprio così, quindi perché ti poni tanti dubbi? Piuttosto chiediti se "città" può fungere davvero da chiave primaria per aereoporto: esistono città con più aereoporti, poi se nel tuo progetto non hai questo problema è un altro discorso.


Originariamente inviato da gabama
Inoltre che campo devo mettere,(di Postgresql) per mettere ora arrivo e partenza (es.22.45)


Consulta la documentazione di Postgresql, sicuramente avrà dei tipi di dato per tempo e data (timestamp, datetime o simili).

Loading