2012-01-16 44 views
5

tôi không thể tạo phím nước ngoài với ON DELETE SET DEFAULT, nhưng nếu tôi sử dụng ON DELETE CASCADE sau đó tất cả các công trình ở đây là sql tôiKhông thể tạo khóa ngoại với ON DELETE SET DEFAULT

CREATE TABLE person( 
    customer_id INT AUTO_INCREMENT PRIMARY KEY, 
    name VARCHAR(100) UNIQUE 
); 


CREATE TABLE habits( 
    customer_id INT AUTO_INCREMENT PRIMARY KEY, 
    habit VARCHAR(100) UNIQUE 
); 

INSERT INTO `test`.`habits` (`customer_id`, `habit`) VALUES (NULL, 'smoking'), (NULL, 'drinking'); 
INSERT INTO `test`.`person` (`customer_id`, `name`) VALUES (NULL, 'John'), (NULL, 'Steve'); 

CREATE TABLE foreigner( 
    customer_id INT AUTO_INCREMENT PRIMARY KEY, 
    customer VARCHAR(100) DEFAULT 'John', 
    habbit VARCHAR(100) DEFAULT 'smoking', 
    FOREIGN KEY (customer) REFERENCES person(name) ON DELETE SET DEFAULT ON UPDATE CASCADE, 
    FOREIGN KEY (habbit) REFERENCES habits(habit) ON DELETE SET DEFAULT ON UPDATE CASCADE  
); 

Đó là lạ mà nó hoạt động nếu tôi sử dụng ON DELETE CASCADE .... bất kỳ suy nghĩ nào?

+0

Vì vậy, thay vì 5 (hoặc bất kỳ số olther khác) sẽ bị xóa khỏi bảng 'người nước ngoài' (do hiệu ứng xếp tầng), bạn muốn kết thúc với năm (gần như) hàng giống hệt nhau với' (khách hàng, habbit) = ('John,' hút thuốc ') '. Tại sao bạn sẽ muốn điều đó? –

+0

Và tôi không thể cưỡng lại việc đề cập đến 3 cột 'customer_id' vô dụng. –

+0

bảng với những giá trị đó chỉ là một ví dụ - trong thực tế tôi có nhiều bảng lớn hơn với các giá trị và hàng thậm chí có thể hữu ích :) – fjckls

Trả lời

3

Từ MySQL Reference Manual ...

SET DEFAULT: Hành động này được công nhận bởi các phân tích cú pháp, nhưng InnoDB từ chối bàn định nghĩa chứa ON SET DEFAULT DELETE hoặc ON CẬP NHẬT khoản SET DEFAULT.

Bạn có thể thử SET NULL, nhưng tôi không chắc liệu điều đó có thể gây ra các sự cố khác cho bạn hay không.

+1

Cảm ơn tôi đã thử ON DELETE SET NULL và nó hoạt động. Tôi đoán sẽ phải gắn bó với điều đó .. nếu InnoDB không hỗ trợ ON DELETE SET DEFAULT, động cơ nào sẽ hỗ trợ nó với các khóa ngoài cùng với ON UPDATE CASCADE? – fjckls

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