View Full Version : [SQL] Problema con chiavi esterne: help me...
Fabietto206
19-03-2009, 10:05
Ragazzi ho queste 3 tabelle:
anagrafica(cf, nome, cognome) cf è chiave primaria
medico(cf, nome, cognome, tel) cf è chiave primaria
in_cura(paziente, medicocur) paziente è chiave primaria; paziente si riferisce ad anagrafica(cf) e medicocur si riferisce a medico(cf).
il mio problema in MySQL è ke inserendo dei record nella tabella in_cura mi da errore, qualcuno sa dirmi il motivo? E una possibile soluzione se esiste...
La spiegazione più immediata è che, essendo in_cura una tabella di raccordo, tu possa aver tentato di inserire chiavi ( i cf ) non presenti nelle rispettive tabelle dove sono chiavi primarie...
Questa tabella di raccordo che hai creato è corretta, ma utile solo nel caso in cui ci possano essere relazioni molti<->molti tra le tabelle di riferimento ( 1Paziente-> Molti medici e 1 Medico -> molti pazienti ).
Se invece 1 medico curante ha molti pazienti, e un paziente ha 1 solo medico per volta, è superflua.
Fabietto206
19-03-2009, 13:16
La spiegazione più immediata è che, essendo in_cura una tabella di raccordo, tu possa aver tentato di inserire chiavi ( i cf ) non presenti nelle rispettive tabelle dove sono chiavi primarie...
Questa tabella di raccordo che hai creato è corretta, ma utile solo nel caso in cui ci possano essere relazioni molti<->molti tra le tabelle di riferimento ( 1Paziente-> Molti medici e 1 Medico -> molti pazienti ).
Se invece 1 medico curante ha molti pazienti, e un paziente ha 1 solo medico per volta, è superflua.
Si d'accordo, xò io voglio associare un medico a un paziente e viceversa e nn capisco il motivo x cui nn me li fa inserire dandomi un errore!!
Cmq i cf di entrambi nelle tabelle origine sono stati inseriti...
Tu ke dati mi consigli di inserire nella tabella? Mi serve soprattutto xkè dovrei fare un paio di query su questa tabella...
Grazie mille marco
Io questa tabella in_cura la vedo un po' come una tabella "dettaglioVisite", con un idVisita (PK), dataVisita, cfPaziente (FK), cfMedico (FK).
Detto questo onestamente non ti so dire perchè nel tuo caso vada in errore...
anche sapere l'errore non sarebbe male :D magari anche vedere il codice con cui hai creato le tabelle.
Fabietto206
19-03-2009, 15:37
Ok, vi posto il tutto:
CREATE TABLE `dati_anagrafici` (
`Codice_fiscale` varchar(25) NOT NULL,
`Nome` varchar(25) NOT NULL,
`Cognome` varchar(25) NOT NULL,
`Data_di_nascita` DATE NOT NULL,
PRIMARY KEY (`Codice_fiscale`)
)
ENGINE = InnoDB;
CREATE TABLE `medico_curante` (
`Codice_fiscale` varchar(25) NOT NULL,
`Nome` varchar(25) NOT NULL,
`Cognome` varchar(25) NOT NULL,
`Telefono` int NOT NULL,
PRIMARY KEY (`Codice_fiscale`)
)
ENGINE = InnoDB;
CREATE TABLE `in_cura` (
`Paziente` varchar(25) NOT NULL,
`Medico_curante` varchar(25) NOT NULL,
PRIMARY KEY (`Paziente`),
FOREIGN KEY(`Paziente`) REFERENCES `dati_anagrafici`(`Codice_fiscale`),
FOREIGN KEY(`Medico_curante`) REFERENCES `medico_curante`(`Codice_fiscale`)
)
ENGINE = InnoDB;
Dopo aver fatto un po di INSERT tra le quali:
INSERT INTO dati_anagrafici(Codice_fiscale, Nome, Cognome, Data_di_nascita) VALUES (‘PICGIU89E25T786V’,’Giulia’,’Piccoli’,’1989-5-25’)
INSERT INTO medico_curante(Codice_fiscale, Nome, Cognome, Telefono) VALUES (‘SCIPAO53G6T236L’,’Paolo’,’Scivetti’,’027610686’)
Vorrei fare la seguente INSERT:
INSERT INTO in_cura(Paziente, Medico_curante) VALUES (‘PICGIU89E25T786V’,’ SCIPAO53G6T236L’)
Ma mi da il seguente errore:
Cannot add or update a child row: a foreign key constraint fails ('progetto\in_cura', constraint 'fk_in_cura_2' foreign key ('Medico_curante') references 'medico_curante' ('Codice_fiscale'))
guarda la query di inserimento in in_cura, il secondo codice fiscale ha uno spazio davanti, è per questo che non funziona.
ciao
Fabietto206
19-03-2009, 17:08
guarda la query di inserimento in in_cura, il secondo codice fiscale ha uno spazio davanti, è per questo che non funziona.
ciao
:D Avevi ragione, ho risolto tutto!!! ke pirla sn stato:muro: :doh:
Grazie mille x l'aiuto
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.