2011-09-24 58 views
9

Tôi có ba bảng: danh mục, ngôn ngữ và danh mục_languages. Danh mục_languages ​​là nhiều đến nhiều bảng liên kết các danh mục và ngôn ngữ với nhau. Tôi muốn cập nhật một giá trị khóa foregin trong ngôn ngữ bảng nhưng nó ném cho tôi lỗi # 1451 - Không thể xóa hoặc cập nhật hàng gốc: ràng buộc khóa ngoài không thành công!Cách cập nhật giá trị khóa ngoài trong cơ sở dữ liệu 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ỗi này rõ ràng với tôi, nhưng làm cách nào để cập nhật giá trị khóa trong trường hợp này? Tôi đã cố gắng thêm 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; 

nhưng điều đó cũng không thành công với thông điệp: MySQL nói: Documentation # 1005 - Không thể tạo bảng './db_dodo/#sql-c2f_80e6f.frm' (errno: 121)

+0

gì được truy vấn cập nhật bạn đang chạy mà tạo ra lỗi? – bobwienholt

Trả lời

40

Bạn có thể tạm đình chỉ kiểm tra chính nước ngoài:

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: đối với các vấn đề chính nước ngoài: là các dữ liệu được lưu trữ trên một địa phương hoặc một hệ thống tập tin từ xa? errno 121 là EREMOTEIO (Lỗi I/O từ xa). Có lẽ có sự cố về quyền đối với hệ thống tệp đích hoặc không hỗ trợ ký tự # trong tên tệp?

+0

Xin cảm ơn. Điều này đã giúp, tôi đã có thể cập nhật các bảng! Vẫn không biết tại sao tôi không thể thay đổi các ràng buộc bảng để thêm ràng buộc ON UPDATE CASCADE ...?! –

+1

Bạn nên KHÓA các bảng trước và mở khóa chúng sau để tránh chèn không hợp lệ từ một phiên khác trong các chỉnh sửa của bạn. –

0

Nếu bạn đang tìm kiếm một giải pháp tạm thời bạn cũng có thể thay đổi hành động ON UPDATE để CASCADE và sửa đổi id của bạn

Các vấn đề liên quan