|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Feb 2002
Messaggi: 1370
|
[SQL] Problema con la CREATE TABLE...
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? |
|
|
|
|
|
#2 |
|
Member
Iscritto dal: Aug 2005
Messaggi: 168
|
Puoi creare le due tabelle senza i REFERENCES e poi fare una cosa tipo:
Codice:
alter table Prenotazioni add constraint FKRegistra_FK
foreign key (username)
references Accounts ON DELETE CASCADE;
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. Ultima modifica di Kenger : 25-05-2010 alle 20:41. |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Feb 2002
Messaggi: 1370
|
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). |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Feb 2002
Messaggi: 1370
|
Ho un altro problema, come faccio a scrivere in sql un vincolo di inclusione?
Sto usando postgresql e scrivendo alla fine: Codice:
ALTER TABLE entity ADD CONSTRAINT entityincludecheck CHECK (Login in (Select Login from relation)) Codice:
Error code 0, SQL state 0A000: ERROR: cannot use subquery in check constraint 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! |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: May 2004
Messaggi: 1136
|
Ma per vincolo cosa intendi, la chiave esterna?
Se sì, penso che ti serva questo: http://www.postgresql.org/docs/8.4/s...CONSTRAINTS-FK |
|
|
|
|
|
#6 |
|
Member
Iscritto dal: Aug 2005
Messaggi: 168
|
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. |
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Feb 2002
Messaggi: 1370
|
Quote:
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? |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 09:57.




















