Nó là một "gotcha" của MySQL . Cách đầu tiên KHÔNG hoạt động.
Từ tài liệu MySQL, các FOREIGN KEY
ràng buộc :
Quan trọng:
... 4 đoạn dưới đây ...
Hơn nữa, InnoDB không nhận ra hoặc hỗ trợ các thông số kỹ thuật TÀI LIỆU THAM KHẢO trực tuyến . InnoDB chỉ chấp nhận các điều khoản TÀI LIỆU THAM KHẢO khi được chỉ định là một phần của thông số FOREIGN KEY riêng biệt. Đối với các công cụ lưu trữ khác, Máy chủ MySQL phân tích cú pháp và bỏ qua các thông số kỹ thuật khóa ngoài.
Tạo 2 bảng (cách 1):
CREATE TABLE parent_table (
parent_id int(11) not null auto_increment,
PRIMARY KEY(parent_id)
);
CREATE TABLE child1 (
id int(11) not null auto_increment,
parent_id int(11) REFERENCES parent_table(parent_id) ON DELETE CASCADE,
PRIMARY KEY(id)
);
Hãy xem những gì là child1
:
> SHOW CREATE TABLE child1 ;
delimiter $$
CREATE TABLE `child1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`parent_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8$$
Đâu là FOREIGN KEY
? ... Cuốn theo chiều gió (và không có cảnh báo)
Tạo bảng child2
(cách 2) hoạt động tốt:
CREATE TABLE child2 (
id int(11) not null auto_increment,
parent_id int(11),
PRIMARY KEY(id),
FOREIGN KEY(parent_id) REFERENCES parent_table(parent_id) ON DELETE CASCADE
);
> SHOW CREATE TABLE child2 ;
delimiter $$
CREATE TABLE `child2` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`parent_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `parent_id` (`parent_id`),
CONSTRAINT `child2_ibfk_1`
FOREIGN KEY (`parent_id`) REFERENCES `parent_table` (`parent_id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8$$