2011-09-24 16 views
9

Ho tre tabelle: categorie, lingue e categorie_lingue. Categories_languages ​​è una tabella molti a molti che collega categorie e lingue. Vorrei aggiornare un valore chiave di foregin nei linguaggi della tabella ma mi genera errore # 1451 - Impossibile eliminare o aggiornare una riga padre: un vincolo di chiave esterna non riesce!Come aggiornare il valore della chiave esterna nel database mysql

CREATE TABLE IF NOT EXISTS `categories` (
    `id` int(11) unsigned NOT NULL auto_increment, 
    `name` varchar(20) NOT NULL, 
    `modified` int(10) unsigned NOT NULL, 
    PRIMARY KEY (`id`), 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

CREATE TABLE IF NOT EXISTS `languages` (
    `id` char(2) NOT NULL, 
    `name` varchar(20) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

CREATE TABLE IF NOT EXISTS `categories_languages` (
    `id` int(11) unsigned NOT NULL auto_increment, 
    `category_id` int(11) unsigned NOT NULL, 
    `language_id` char(2) NOT NULL, 
    `translation` varchar(20) NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `fk_category_id_language_id` (`category_id`,`language_id`), 
    KEY `fk_language_id` (`language_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ; 

ALTER TABLE `categories_languages` 
    ADD CONSTRAINT `categories_languages_ibfk_1` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`) ON DELETE CASCADE, 
    ADD CONSTRAINT `categories_languages_ibfk_2` FOREIGN KEY (`language_id`) REFERENCES `languages` (`id`) ON DELETE CASCADE; 

L'errore è chiaro per me, ma come posso aggiornare un valore chiave in questo caso? Ho provato ad aggiungere ON updata CASCADE:

ALTER TABLE `categories_languages` 
    ADD CONSTRAINT `categories_languages_ibfk_1` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, 
    ADD CONSTRAINT `categories_languages_ibfk_2` FOREIGN KEY (`language_id`) REFERENCES `languages` (`id`) ON DELETE CASCADE ON UPDATE CASCADE; 

ma che riesce anche con il messaggio: MySQL ha detto: Documentazione # 1005 - Impossibile creare la tabella './db_dodo/#sql-c2f_80e6f.frm' (errno: 121)

+0

Qual è la query di aggiornamento si esegue che genera l'errore? – bobwienholt

risposta

40

È possibile sospendere temporaneamente estera controllo chiave:

SET foreign_key_checks = 0; 
UPDATE languages SET id='xyz' WHERE id='abc'; 
UPDATE categories_languages SET language_id='xyz' WHERE language_id='abc'; 
SET foreign_key_checks = 1; 

EDIT: per quanto riguarda il problema chiave esterna: sono i dati memorizzati su un file system locale o remoto? errno 121 è EREMOTEIO (errore I/O remoto). Forse ci sono problemi di autorizzazione sul file system di destinazione o non supporta il carattere # nei nomi dei file?

+0

Hey, grazie. Questo mi ha aiutato, sono stato in grado di aggiornare i tavoli! Ancora non so perché non riesco a modificare i vincoli di tabella per aggiungere il vincolo ON UPDATE CASCADE ...?! –

+1

È necessario BLOCCARE le tabelle prima e SBLOCCARLO dopo per impedire inserimenti non validi da un'altra sessione durante le modifiche. –

0

Se siete alla ricerca di una soluzione temporanea è anche possibile modificare l'azione ON UPDATE per CASCADE e modificare i propri ID

Problemi correlati