Salve sto avendo dei problemi con le chiavi esterne, usando la funzione ON UPDATE.
premetto una domanda... MA UNA CHIAVE ESTERNA VIENE MESSA SU UNA TABELLA PADRE O SU UNA TABELLA FIGLIO?
io credo su una figlio; cmq ecco un po di codice
codice:
CREATE TABLE IF NOT EXISTS `tipologia_fornitore` (
`TIPOLOGIA_FORNITORE_id` bigint(10) NOT NULL auto_increment,
`TIPOLOGIA_FORNITORE_nome` varchar(100) NOT NULL,
`TIPOLOGIA_FORNITORE_active` enum('si','no') NOT NULL default 'si',
PRIMARY KEY (`TIPOLOGIA_FORNITORE_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;
CREATE TABLE IF NOT EXISTS `fornitore` (
`FORNITORE_id` bigint(10) NOT NULL auto_increment,
`FORNITORE_nome` varchar(100) NOT NULL,
`FORNITORE_indirizzo` varchar(100) NOT NULL,
`FORNITORE_telefono` varchar(100) NOT NULL,
`TIPOLOGIA_FORNITORE_id` bigint(10) NOT NULL,
`FORNITORE_active` enum('si','no') NOT NULL default 'si',
PRIMARY KEY (`FORNITORE_id`),
KEY `TIPOLOGIA_FORNITORE_id` (`TIPOLOGIA_FORNITORE_id`,`FORNITORE_active`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
quindi tipologia_fornitore è la tabella padre mentre fornitore è la tabella figlio.
la chiave in "relazione" è TIPOLOGIA_FORNITORE_id
nel mio database effettuo cancellazioni logiche per questo ho il campo active, quindi se CANCELLO un record dalla tabella tipologia_fornitore (EFFETTUANDO UN UPDATE LDEL CAMPO ACTIVE = no) tutti i campi active della tabella fornitore verranno impostati su no dove TIPOLOGIA_FORNITORE_id = TIPOLOGIA_FORNITORE_id
sono stato chiaro?
e fino a qui tutto ok, o almeno sembra funzionare.
il mio problema è questo... se voglio CANCELLARE un fornitore (QUINDI SEMPRE AGGIORNANDO IL CAMPO ACTIVE) la chiave esterna si incazza
codice:
UPDATE fornitore SET `FORNITORE_active` = 'no' WHERE FORNITORE_id =3
#1452 - Cannot add or update a child row: a foreign key constraint fails
(`intranet/fornitore`, CONSTRAINT `fornitore_fk` FOREIGN KEY
(`TIPOLOGIA_FORNITORE_id`, `FORNITORE_active`) REFERENCES `tipologia_fornitore`
(`TIPOLOGIA_FORNITORE_id`, `TIPOLOGIA_FORNITORE_active)
credo che sia giusto che la chiave esterna si comporti così, ma come posso risolvere il mio problema? se voglio settare active su no in una tabella figlia?
la cosa che mi fa riflettere è questa... se invece di impostare una chiave di questo tipo, metto in relazione solo i campi TIPOLOGIA_FORNITORE_id on update no action, on delete cascade succede che io riesco a cancellare FISICAMENTE i campi da una tabella figlio senza che la chiave esterna si incazzi, ma a me non serve questo 
spero di essere stato chiaro e non ripetitivo, aspetto vostri consigli
grazie
ps, devo mettermi un po a studiare sql
:master: