2012-01-24 26 views
7

Tôi đang cố gắng tạo cơ sở dữ liệu, trong đó có 2 bảng có khóa ngoài phụ thuộc lẫn nhau.mysql - Các khóa ngoại lệ phụ thuộc lẫn nhau

Bảng đầu tiên được gọi là câu hỏi, nó chứa dữ liệu liên quan đến câu hỏi được người dùng hỏi và cũng cần giữ chìa khóa cho câu trả lời hay nhất đã được trả lời cho câu hỏi. (Đây phải là khóa ngoài cho bảng thứ hai của chúng tôi gọi là Trả lời)

Bảng thứ hai được gọi là Trả lời, nó chứa thông tin liên quan đến câu hỏi và cũng cần giữ trường question_id, đó là chìa khóa cho câu hỏi câu trả lời này trả lời. đây cũng là khóa ngoại, cho bảng đầu tiên.

Khi tôi cố gắng tạo bảng, nó không thể tạo bảng, vì nó không nhận biết được bảng thứ hai (lỗi khi chúng tôi cố gắng khai báo khóa ngoài với bảng thứ hai chưa tồn tại)

Dưới đây là đoạn code tôi đang sử dụng:

create table question 
(q_id    numeric(10,0), 
    best_a_id   numeric(10,0), 
primary key(q_id), 
foreign key (best_a_id) references answer(a_id), 
); 


create table answer 
(a_id    numeric(10,0), 
    q_id    numeric(10,0) not null, 
primary key(a_id), 
foreign key (q_id) references question(q_id), 
); 

Làm thế nào để giải quyết vấn đề này? Cảm ơn

+1

Xem câu trả lời của tôi trong một câu hỏi tương tự: [Cách tốt nhất để chèn hàng vào bảng có tham chiếu 1 đến 1 của nhau là gì?] (Http://stackoverflow.com/questions/6691366/mysql-database-design -Inerting-rows-in-1to1-tables/6692054 # 6692054) –

Trả lời

4

Tạo bảng đầu tiên không có ràng buộc khóa ngoài. Sau đó tạo bảng thứ hai như là. Cuối cùng, quay trở lại và thay đổi bảng đầu tiên, thêm ràng buộc khóa ngoài một cách riêng biệt.

Và SQL để thêm phím nước ngoài sẽ trông như thế này:

ALTER TABLE question 
ADD FOREIGN KEY (best_a_id) 
REFERENCES answer(a_id); 

Chỉ cần tò mò, nhưng tại sao duy trì mối quan hệ câu hỏi để trả lời ở cả hai bảng? Bởi vì (như ypercube chỉ ra) bạn không có một "câu trả lời hay nhất" khi câu hỏi được hỏi đầu tiên, nhưng thiết kế của bạn yêu cầu nó. Nó có lẽ tốt hơn để duy trì mối quan hệ đó trong bảng câu trả lời, tương tự như cách mà Olivier đề xuất.

+0

Wow !!!! Cảm ơn bạn rât nhiêu!!! =] –

+4

Và sau đó, bạn sẽ chèn hàng như thế nào? –

+1

@happy dude: Điều này có thể hoạt động, chỉ khi 'question.best_a_id' được đặt là Nullable. –

3

Thêm cờ vào bảng câu trả lời.

create table answer 
(a_id    numeric(10,0), 
    q_id    numeric(10,0) not null, 
    best_answer  numeric(1) default 0 not null, 
primary key(a_id), 
foreign key (q_id) references question(q_id), 
); 

Và xóa best_a_id khỏi bảng câu hỏi.

+0

Đây là cách tiếp cận tốt hơn nhưng bit khéo léo là đảm bảo rằng chỉ có một câu trả lời là câu trả lời đúng nhất cho mỗi câu hỏi. Tôi biết làm thế nào để làm điều này với Oracle DBMS nhưng tôi không nghĩ rằng MySQL hỗ trợ các chỉ số dựa trên chức năng, độc đáo hay cách khác. – APC

+2

Không tệ, nhưng tôi muốn có một bảng best_answer. –

+0

Bạn cũng có thể sử dụng trình kích hoạt CẬP NHẬT CẬP NHẬT SAU để xóa cờ của các câu trả lời khác với cùng một câu hỏi_id. –

5

Hãy xem xét loại bỏ question.best_a_id và, thay vào đó, thêm một bảng best_answers:

create table best_answers 
(q_id    numeric(10,0), 
    best_a_id   numeric(10,0), 
primary key(q_id), 
foreign key (best_a_id, q_id) references answer(a_id, q_id) 
); 

Nếu bạn đã từng có nhiều hơn một câu trả lời tốt nhất cho một câu hỏi cụ thể (có thể là một cà vạt), thêm best_a_id cũng là cột chính.

+0

Tôi đã chỉnh sửa câu trả lời của bạn để phản ánh đúng tham chiếu. –

+0

Cảm ơn, @ypercube –

+0

Trong MySQL, một 'UNIQUE KEY' trong bảng' answer' trên '(a_id, q_id)' cũng sẽ cần thiết. –

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