Help: foreign key!!

Salve, sto tentando di costruire un database con mysql, ma ho un problema con le foreign key:quando lancio dalla command line lo script del mio db è tutto ok, il problema si verifica quando lancio i dati..ecco il tipo di errore:

ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint f

ails (`prova/altri_esami_ricovero`, CONSTRAINT `altri_esami_ricovero_ibfk_1` FOR

EIGN KEY (`Data_inizio_ric`, `Codice_paziente`) REFERENCES `ricovero` (`Data_ini

zio_ricovero`, `Codice_paziente`) ON U)

Query OK, 2 rows affected (0.08 sec)

Records: 2  Duplicates: 0  Warnings: 0

Ecco il mio script:

CREATE DATABASE IF NOT EXISTS `prova`

  CHARACTER SET latin1 COLLATE latin1_swedish_ci;

-- -------------------------------------

-- Tables

DROP TABLE IF EXISTS `prova`.`Ricovero`;

CREATE TABLE `prova`.`Ricovero` (

  `Data_inizio_ricovero` DATETIME NULL,

  `Codice_paziente` INT(10) NULL,

  `Data_fine_ricovero` DATETIME NULL,

  PRIMARY KEY (`Data_inizio_ricovero`, `Codice_paziente`)

)

ENGINE = INNODB;

DROP TABLE IF EXISTS `prova`.`Altri_esami_ricovero`;

CREATE TABLE `prova`.`Altri_esami_ricovero` (

  `Codice_altri_esami_ricov` INT(10) NOT NULL,

  `DataVisita` DATETIME NULL,

  `Eco_TEE` TINYINT(1) NOT NULL,

  `TrombosiAS` TINYINT(1) NOT NULL,

  `ProtesiValvolari1` VARCHAR(50) NULL,

  `ProtesiValvolari2` VARCHAR(50) NULL,

  `StenosiValvoleMitralica` DOUBLE(15, 5) NULL,

  `StenosiValvoleAortica` INT(10) NULL,

  `InsufficienzaValvoleMitralica` VARCHAR(50) NULL,

  `InsufficienzaValvoleAortica` VARCHAR(50) NULL,

  `InsufficienzaValvoleTricuspidale` VARCHAR(50) NULL,

  `AltroEcoTEE` LONGTEXT NULL,

  `EcoStress` TINYINT(1) NOT NULL,

  `TipoEcoStr1` TINYINT(1) NOT NULL,

  `TipoEcoStr2` TINYINT(1) NOT NULL,

  `RispostaEcoStr1` TINYINT(1) NOT NULL,

  `RispostaEcoStr2` TINYINT(1) NOT NULL,

  `RispostaEcoStr3` TINYINT(1) NOT NULL,

  `RispostaEcoStr4` TINYINT(1) NOT NULL,

  `AltroEcoStr` LONGTEXT NULL,

  `Scintigrafia_miocardica` TINYINT(1) NOT NULL,

  `TipoScinM1` TINYINT(1) NOT NULL,

  `TipoScinM2` TINYINT(1) NOT NULL,

  `TipoScinM3` TINYINT(1) NOT NULL,

  `RispostaScinM1` TINYINT(1) NOT NULL,

  `RispostaScinM2` TINYINT(1) NOT NULL,

  `RispostaScinM3` TINYINT(1) NOT NULL,

  `RispostaScinM4` TINYINT(1) NOT NULL,

  `AltroScinM` LONGTEXT NULL,

  `ScintigrafiaRenale` TINYINT(1) NOT NULL,

  `FaseScinR1` VARCHAR(50) NULL,

  `FaseScinR2` VARCHAR(50) NULL,

  `FaseScinR3` VARCHAR(50) NULL,

  `GFRScinR` DOUBLE(15, 5) NULL,

  `AltroScinR` LONGTEXT NULL,

  `PFR` TINYINT(1) NOT NULL,

  `ValoreMisFVC` DOUBLE(15, 5) NULL,

  `%TeorFVC` DOUBLE(15, 5) NULL,

  `ValoreMisFEV1` DOUBLE(15, 5) NULL,

  `%TeorFEV1` DOUBLE(15, 5) NULL,

  `ValoreMisFEF25-75%` DOUBLE(15, 5) NULL,

  `%TeorFEF25-75%` DOUBLE(15, 5) NULL,

  `ValoreMisRV` DOUBLE(15, 5) NULL,

  `%TeorRV` DOUBLE(15, 5) NULL,

  `ValoreMisTLC` DOUBLE(15, 5) NULL,

  `%TeorTLC` DOUBLE(15, 5) NULL,

  `ValoreMisRV/TLC` DOUBLE(15, 5) NULL,

  `%TeorRV/TLC` DOUBLE(15, 5) NULL,

  `EGDS` TINYINT(1) NOT NULL,

  `UlceraEGDS` TINYINT(1) NOT NULL,

  `ErosioniEGDS` TINYINT(1) NOT NULL,

  `SanguinamentoEGDS` TINYINT(1) NOT NULL,

  `AltroEGDS` LONGTEXT NULL,

  `Eco_renale` TINYINT(1) NOT NULL,

  `NormaleEcoR` TINYINT(1) NOT NULL,

  `DimensioniEcoR` VARCHAR(50) NULL,

  `RapportoCortMidEcoR` VARCHAR(50) NULL,

  `CistiRenali` TINYINT(1) NOT NULL,

  `Calcoli` TINYINT(1) NOT NULL,

  `AltroEcoR` LONGTEXT NULL,

  `TAC` LONGTEXT NULL,

  `AltroAlEsRic` LONGTEXT NULL,

  `Data_inizio_ric` DATETIME NULL,

  `Codice_paziente` INT(10) NULL,

  PRIMARY KEY (`Codice_altri_esami_ricov`),

  INDEX `RicoveroAltri_esami_ricovero` (`Data_inizio_ric`, `Codice_paziente`),

  FOREIGN KEY (Data_inizio_ric, Codice_paziente) REFERENCES Ricovero (Data_inizio_ricovero, Codice_paziente)ON UPDATE   CASCADE,

  INDEX `Codice_altri_esami_amb` (`Codice_altri_esami_ricov`),

  INDEX `Codice_paziente` (`Codice_paziente`),

  INDEX `Data_inizio_ricov` (`Data_inizio_ric`),

  INDEX `RapportoCortMid` (`RapportoCortMidEcoR`)

)

ENGINE = INNODB;

-- ----------------------------------------------------------------------

-- EOF

Grazie mille

Claudia

inviato 10 anni fa
malcico
X 0 X

Ciao malcico e benvenuto,

come avrai notato il problema non è nella struttura del database ma si verifica nell'inserimento dei dati. L'errore che ricevi ti avverte che i dati che stai cercando di inserire non rispettano uno dei vincoli imposti dalle FK specificate nella stessa struttura del database.

I motivi possono essere disparati ma spesso questo problema si verifica quando si cerca di rispristinare in un nuovo database dei dati precedentementi presenti in un altro database (backup -> restore). E' questo il tuo caso?

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Ciao Gianni innanzitutto grazie per la tua collaborazione.

Avevi ragione tu era un problema di inserimento dati..

Avrei un altro quesito da porti:è possibile ,con la sintassi di mysql, avvisare con  un messaggio che il valore che si sta inserendo su un campo non è corretto?Intedo sempre nello script.Non so se mi sono spiegata..

poichè mysql non supporta o megio ignora il check sto cercando di scrivere i vincoli di dominio di un campo attraverso i triggers e vorrei che fosse possibile avvisare l'utente del db dell'errore con un messaggio video.Esiste tale costrutto?

ecco il mio trigger:

create trigger pv.ciccio

  before insert

  on altri_esami_ricovero

  for each row

  begin

    IF NEW.StenosiValvoleMitralica >5 OR NEW.StenosiValvoleMitralica <0 THEN

     INSERT INTO errori VALUES ('Il valore immesso di Altri_esami_ricovero.StenosiValvoleMitralica deve essere compreso fra 0 e 5!') ;

     SET NEW.StenosiValvoleMitralica=999;

    END IF;

end;//

delimiter ;

Grazie mille

Claudia

risposto 10 anni fa
malcico
X 0 X

Non ho capito se desideri realizzare il trigger in MySQL oppure simulare tale funzionalita attraverso uno script PHP. Entrambe le strade sono percorribili.

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Allora intendo realizzare il trigger in Mysql, è possibile?

Grazie ancora

risposto 10 anni fa
malcico
X 0 X

Si, ma solo con MySQL 5. Non ho nozioni approfondite a riguardo quindi ti consiglio di guardare la documentazione ufficiale per verificare che il tuo trigger sia realizzabile con MySQL.

http://dev.mysql.com/doc/refman/5.0/en/triggers.html

In caso contrario puoi sempre integrare la logica del trigger nello script PHP.

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda