2011-09-24 27 views
9

Üç tablom var: kategoriler, diller ve kategoriler_dilimler. Categories_languages, kategorileri ve dilleri birbirine bağlayan pek çok tabloya sahiptir. Tablo dillerindeki bir foregin anahtar değerini güncellemek isterim ama bu beni hata atar # 1451 - Bir üst satır silinemiyor veya güncellenemiyor: Yabancı anahtar kısıtlaması başarısız!Mysql veritabanında yabancı anahtar değeri nasıl güncelleştirilir

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; 

Hata bana açık, ancak bu durumda anahtar değerini nasıl güncelleyebilirim?

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; 

ama bu da iletisiyle başarısız olur: Ben updata CASCADE ON ekleyerek çalıştı MySQL söyledi: Belgeler # 1005 - tablosunu './db_dodo/#sql-c2f_80e6f.frm' (errno: 121) oluşturulamıyor

+0

güncelleştirme sorgusu o hatayı oluşturur Ne çalıştıran edilir? – bobwienholt

cevap

40

geçici yabancı anahtar kontrolü askıya alabilir:

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: yabancı anahtar sorununa gelince: veriler yerel veya uzak dosya sisteminde saklanır? errno 121, EREMOTEIO'dur (Uzak G/Ç hatası). Belki hedef dosya sisteminde izin problemleri var veya dosya adlarında # karakterini desteklemiyor mu? Eğer geçici bir çözüm arıyorsanız

+0

Hey teşekkürler. Bu yardımcı oldu, tabloları güncelleştirmeyi başardı! Hala neden UPDATE CASCADE kısıtlaması eklemek için tablo kısıtlamalarını değiştiremediğimi bilmiyorum ...?! –

+1

Düzenlemeleriniz sırasında başka bir oturumdaki geçersiz eklemeleri önlemek için tabloları daha önce KİLİTLENMEYİN ve KİLİTLENMEKLERİNİ daha sonra KİLİTLENMELİSİNİZ. –

0

ayrıca CASCADE için ON UPDATE eylemi değiştirmek ve kimlikleri değiştirebilir

İlgili konular