PDA

View Full Version : [SQL] Problema con la CREATE TABLE...


Player1
25-05-2010, 19:19
Salve ho un problema nella realizzazione di un database, evitando di postare qui tutto lo schema faccio un semplice esempio.

Supponiamo di avere un diagramma ER con l'entità "ENT" ed una sua relazione "REL" e che la cardinalità di partecipazione sia (1,n), traducendo nello schema relazionale si ha:

REL (idEntità, .. )
foreign key: REL[idEntità] incluso in ENT[id]

ENT(id, ..)
include: ENT[id] incluso in REL[idEntità] (Questo perchè partecipa con cardinalità minima 1 alla relazione)

Quando vado a creare queste tabelle in sql se creo prima la tabella REL mi da errore perché non può creare la foreign key visto che ENT ancora non è stata creata, se creo prima ENT mi da errore perché non può creare la inclusione visto che REL ancora non è stata creata.

Come faccio a creare il database in questi casi?

Kenger
25-05-2010, 19:38
Puoi creare le due tabelle senza i REFERENCES e poi fare una cosa tipo:
alter table Prenotazioni add constraint FKRegistra_FK
foreign key (username)
references Accounts ON DELETE CASCADE;

Dove username è l'attributo che diventa foreign key mentre Accounts è l'altra tabella.

EDIT: Mi sa che ho letto male... Stai modellando una relazione 1-n con una tabella? Quindi una tabella per la relazione e 2 per le entità? Se si stai sbagliando.

Player1
25-05-2010, 20:26
Grazie per la risposta, ora provo a fare l'alter table!
Sto modellando 2 entità ed una relazione con un totale di 3 tabelle.
Nell'esempio che ho fatto prima ho preso solo l'entità e la relazione di interesse.
Una entità partecipa alla relazione con cardinalità (1,n) l'altra con cardinalità (0,n). Mi sembra corretto usare 3 tabelle in cosa sto sbagliando? Non ci sono entità che partecipano alla relazione con cardinalità (1,1).

Player1
26-05-2010, 11:14
Ho un altro problema, come faccio a scrivere in sql un vincolo di inclusione?
Sto usando postgresql e scrivendo alla fine:

ALTER TABLE entity ADD CONSTRAINT entityincludecheck CHECK (Login in (Select Login from relation))

mi da il seguendo errore:
Error code 0, SQL state 0A000: ERROR: cannot use subquery in check constraint

Mi sembra strano perché tale notazione (con la select all'interno del check) l'ho trovata proprio su un libro (che però se non sbaglio usa oracle come db).

Come faccio a scrivere questo vincolo in postgresql?

Per quanto riguarda l'errore di prima, quello relativo alla cardinalità (1,n) sto sbagliando o avevi capito male tu dalla mia prima spiegazione? Se sto sbagliando mi spieghi perché?
Grazie!

Johnn
26-05-2010, 18:51
Ma per vincolo cosa intendi, la chiave esterna?

Se sì, penso che ti serva questo:

http://www.postgresql.org/docs/8.4/static/ddl-constraints.html#DDL-CONSTRAINTS-FK

Kenger
26-05-2010, 21:51
Con vincolo intende i CHECK in fase di creazione e l'ultima volta che ho guardato (4 mesi fa circa) postgreSQL non li supporta.

Le relazioni (1,n)-(1,n) solitamente si modellano con 3 tabelle ma le tabelle dalla parte della n non importano nessuna chiave. Solo la tabella della relazione importa le chiavi.

Player1
27-05-2010, 10:51
Con vincolo intende i CHECK in fase di creazione e l'ultima volta che ho guardato (4 mesi fa circa) postgreSQL non li supporta.

Le relazioni (1,n)-(1,n) solitamente si modellano con 3 tabelle ma le tabelle dalla parte della n non importano nessuna chiave. Solo la tabella della relazione importa le chiavi.

Grazie mille, era esattamente questo il problema.
Quindi cosa dovrei fare? Devo fare i controlli direttamente dall'applicazione (in questo caso in php) o postgresql fornisce qualche altro costrutto differente come ad esempio di trigger e delle funzioni plpgsql?
Tra l'altro anche in questo caso ho un altro dubbio:
Se ho una semplice generalizzazione che da "Persona" va a "Uomo" e "Donna" e voglio inserire ad esempio i dati relativi ad un uomo, se inizio facendo una insert nella tabella "Uomo" viene segnalato un errore perché non ho ancora inserito i dati in "Persona" e viene violata la foreign key. Se inizio ad inserire i dati nella tabella "Persona" dovrebbe essere comunque segnalato un errore poiché esiste il vincolo dovuto alla generalizzazione completa che Persona = Uomo unito Donna e non ho ancora inserito i dati nella tabella "Uomo", qualunque sia il metodo (check, trigger o altro) con cui definisco quest'ultimo vincolo.
Mi daresti qualche chiarimento per favore?