2010-10-08 39 views
7

Tôi có một truy vấn đơn giảnTại sao 'ràng buộc khoá ngoại' thất bại 'khi khóa ngoại tồn tại?

UPDATE `t_timecard_detail` SET `timeoff_request_id` = 'adad8e0d-c22b-41c3-a460-6cf982729299' WHERE `id` = 'cfc7a0a1-4e03-46a4-af89-069a0661cf55'; 

mang đến cho lỗi này

ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`demo1_timeapp`.`t_timecard_detail`, CONSTRAINT `timeoff_request_id_refs_id_48fe5c4` FOREIGN KEY (`timeoff_request_id`) REFERENCES `t_timeoff_request` (`id`)) 

hạn chế là

CONSTRAINT `timeoff_request_id_refs_id_48fe5c4` FOREIGN KEY (`timeoff_request_id`) REFERENCES `t_timeoff_request` (`id`) 

dù ID 'adad8e0d-c22b-41c3-a460-6cf982729299' tồn tại trong t_timeoff_request table

mysql> select `id` from t_timeoff_request where `id`='adad8e0d-c22b-41c3-a460-6cf982729299'; 
+--------------------------------------+ 
| id         | 
+--------------------------------------+ 
| adad8e0d-c22b-41c3-a460-6cf982729299 | 
+--------------------------------------+ 

Vì vậy, tôi không chắc tại sao mysql lại nói 'ràng buộc khoá ngoại' không thành công khi khóa ngoại tồn tại?

phiên bản

mysql:

$ mysql --version 
mysql Ver 14.14 Distrib 5.1.41, for debian-linux-gnu (i486) using readline 6.1 

Edit: Hình như một bảng có ENGINE = MyISAM và InnoDB khác

sản lượng show create table t_timecard_detail;

CREATE TABLE `t_timecard_detail` (
    `id` varchar(36) NOT NULL, 
    `change_time` datetime NOT NULL, 
    `department_id` varchar(36) DEFAULT NULL, 
    `day` date NOT NULL, 
    `in_punch_id` varchar(36) DEFAULT NULL, 
    `punch_in` datetime DEFAULT NULL, 
    `paid_in` datetime DEFAULT NULL, 
    `infraction_in_id` varchar(36) DEFAULT NULL, 
    `schedule_in` datetime DEFAULT NULL, 
    `type_in` varchar(10) NOT NULL, 
    `out_punch_id` varchar(36) DEFAULT NULL, 
    `punch_out` datetime DEFAULT NULL, 
    `paid_out` datetime DEFAULT NULL, 
    `schedule_out` datetime DEFAULT NULL, 
    `infraction_out_id` varchar(36) DEFAULT NULL, 
    `type_out` varchar(10) NOT NULL, 
    `work_min` int(11) NOT NULL, 
    `ot_min` int(11) NOT NULL, 
    `ot2_min` int(11) NOT NULL, 
    `pay_type_id` varchar(36) NOT NULL, 
    `timecard_id` varchar(36) NOT NULL, 
    `user_entered` tinyint(1) NOT NULL, 
    `comments` varchar(256) DEFAULT NULL, 
    `timeoff_request_id` varchar(36), 
    PRIMARY KEY (`id`), 
    KEY `t_timecard_detail_department_id` (`department_id`), 
    KEY `t_timecard_detail_in_punch_id` (`in_punch_id`), 
    KEY `t_timecard_detail_infraction_in_id` (`infraction_in_id`), 
    KEY `t_timecard_detail_out_punch_id` (`out_punch_id`), 
    KEY `t_timecard_detail_infraction_out_id` (`infraction_out_id`), 
    KEY `t_timecard_detail_pay_type_id` (`pay_type_id`), 
    KEY `t_timecard_detail_timecard_id` (`timecard_id`), 
    KEY `t_timecard_detail_4f5ffbb5` (`timeoff_request_id`), 
    CONSTRAINT `department_id_refs_id_1b23ee35` FOREIGN KEY (`department_id`) REFERENCES `t_department` (`id`), 
    CONSTRAINT `infraction_in_id_refs_id_17b2e173` FOREIGN KEY (`infraction_in_id`) REFERENCES `t_pay_group_infraction` (`id`), 
    CONSTRAINT `infraction_out_id_refs_id_17b2e173` FOREIGN KEY (`infraction_out_id`) REFERENCES `t_pay_group_infraction` (`id`), 
    CONSTRAINT `in_punch_id_refs_id_4d13a8b2` FOREIGN KEY (`in_punch_id`) REFERENCES `t_punch` (`id`), 
    CONSTRAINT `out_punch_id_refs_id_4d13a8b2` FOREIGN KEY (`out_punch_id`) REFERENCES `t_punch` (`id`), 
    CONSTRAINT `pay_type_id_refs_id_70cb7404` FOREIGN KEY (`pay_type_id`) REFERENCES `t_pay_type` (`id`), 
    CONSTRAINT `timecard_id_refs_id_7889236c` FOREIGN KEY (`timecard_id`) REFERENCES `t_timecard` (`id`), 
    CONSTRAINT `timeoff_request_id_refs_id_48fe5c4` FOREIGN KEY (`timeoff_request_id`) REFERENCES `t_timeoff_request` (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 

sản lượng show create table t_timeoff_request;

CREATE TABLE `t_timeoff_request` (
    `id` varchar(36) NOT NULL, 
    `change_time` datetime NOT NULL, 
    `employee_id` varchar(36) NOT NULL, 
    `submitted_date` datetime NOT NULL, 
    `time_off_day` date NOT NULL, 
    `mins_charged` int(11) NOT NULL, 
    `pay_type_id` varchar(36) NOT NULL, 
    `employee_comment` varchar(300) NOT NULL, 
    `approved_status` varchar(10) NOT NULL, 
    `approved_by_id` varchar(36) DEFAULT NULL, 
    `approved_date` datetime DEFAULT NULL, 
    `approved_comment` varchar(300) DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    KEY `t_timeoff_request_employee_id` (`employee_id`), 
    KEY `t_timeoff_request_pay_type_id` (`pay_type_id`), 
    KEY `t_timeoff_request_approved_by_id` (`approved_by_id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 
+0

hiển thị tạo bảng t_timecard_detail; hiển thị tạo bảng t_timeoff_request; – iddqd

+0

@iddqd, tôi đã dán cấu trúc 'tạo bảng' –

Trả lời

18

Tôi nghĩ đó là lỗi. MySQL không cho phép bạn thêm khóa NGOẠI TIẾP tham chiếu đến bảng MyISAM từ InnoDB vì động cơ MyISAM không giao dịch, InnoDb là.

Try: 
ALTER TABLE t_timeoff_request ENGINE=InnoDB; 
+0

có vẻ như một lỗi, nó không nên cho phép khóa ngoài và có thể dẫn đến lỗi rất tinh vi –

+0

Tôi ước tôi có thể upvote câu trả lời này 100 lần. Tôi đã chiến đấu vấn đề này trong nhiều giờ và chắc chắn đủ, bảng chính của tôi là MyISAM vì một lý do nào đó. Cảm ơn bạn iddqd! – Matt

+0

Lỗi tương tự! Nhiều kudo đến iddqd! –

0

Có thể vấn đề nằm trong một bảng khác, nếu bạn đặt một ràng buộc trên FK. Bạn đã thiết lập tùy chọn FK, như ON UPDATE CASCADE?

0

Ràng buộc khóa ngoài không thể áp dụng cho động cơ MyISAM.both nên sử dụng động cơ innodb để hỗ trợ ràng buộc khóa ngoài.

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