ciao a tutti,
sto facedo un piccolo progetto didattico che dovrebbe avvicinarsi alla gestione di una distinta base e perciò 'entità "Articolo" dovrebbe alla fine contenere degli articoli composti da altri articoli.
in fase di progettazione nell'ER ho scelto l'auto associazione sull'entità Articolo.
presupposto che ogni articolo è identificato da una primary key "serial number"
l'altro attributo è "serial number padre" che, data la presenza della auto associazione, è una foreign key:
-- ----------------------------
-- Table structure for articolo
-- ----------------------------
CREATE TABLE `articolo` (
`serial number` varchar(20) NOT NULL default '',
`cliente privato` varchar(20) default NULL,
`cliente azienda` varchar(20) default NULL,
`marca` varchar(20) NOT NULL,
`modello` varchar(20) NOT NULL,
`descrizione` varchar(99) NOT NULL,
`serial number padre` varchar(20) default NULL,
`data vendita` date NOT NULL,
`data sostituzione` date default NULL,
`codice garanzia base` varchar(20) NOT NULL,
PRIMARY KEY (`serial number`),
KEY `cliente privato` (`cliente privato`),
KEY `cliente azienda` (`cliente azienda`),
KEY `marca` (`marca`),
KEY `modello` (`modello`),
KEY `codice garanzia base` (`codice garanzia base`),
KEY `serial number padre` (`serial number padre`),
CONSTRAINT `articolo_ibfk_1` FOREIGN KEY (`serial number padre`) REFERENCES `articolo` (`serial number`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `cliente azienda` FOREIGN KEY (`cliente azienda`) REFERENCES `azienda` (`codice cliente`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `cliente privato` FOREIGN KEY (`cliente privato`) REFERENCES `privato` (`codice cliente`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `codice garanzia base` FOREIGN KEY (`codice garanzia base`) REFERENCES `garanzia_base` (`codice garanzia`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `marca` FOREIGN KEY (`marca`) REFERENCES `tipo` (`marca`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `modello` FOREIGN KEY (`modello`) REFERENCES `tipo` (`modello`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='InnoDB free: 3072 kB; (`Composizione`) REFER `livitekassiste';
-- ----------------------------
-- Records
-- ----------------------------
INSERT INTO `articolo` VALUES ('11111', 'pri012345', null, 'nokia', 'n23', '', '12344', '0000-00-00', null, 'gb0001');
INSERT INTO `articolo` VALUES ('12344', 'pri012345', null, 'nokia', 'n23', '', null, '0000-00-00', null, 'gb0001');
come si può notare dai record, ho 2 articoli. uno è il padre (12344) mentre l'altro è il figlio (11111) che contiene il riferimento al padre tramite l'attributo "serial number padre".
arrivo al dunque:
se modifico la chiave del padre dovrebbe modificare il "serial number padre" nel figlio (la "gestione degli orfani" ON DELETE CASCADE ON UPDATE CASCADE)
però mi da errore (cosa che non succede se uso una foreign key utilizzando un'altra tabella)
Errore
query SQL:
UPDATE `livitekcc`.`articolo` SET `serial number` = '1234444' WHERE CONVERT( `articolo`.`serial number` USING utf8 ) = '12344' LIMIT 1
Messaggio di MySQL:
#1451 - Cannot delete or update a parent row: a foreign key constraint fails (`livitekcc/articolo`, CONSTRAINT `articolo_ibfk_1` FOREIGN KEY (`serial number padre`) REFERENCES `articolo` (`serial number`) ON DELETE CASCADE ON UPDATE CASCADE)
come posso risolvere? c'è un trick da applicare alla tabella?
grazie!