2010-02-03 27 views
23

Từ khóa references được sử dụng khi tạo bảng như thế nào?Làm cách nào để sử dụng từ khóa 'tham chiếu' trong MySQL?

Giả sử tôi muốn tạo hai bảng personhobby và tôi muốn id bảng sở thích tham chiếu id của người?

person table 
- id 
- name 

hobby 
- id 
- person_id 
- hobby_name 

Tôi làm như thế nào?

+1

Đáng chú ý, một FK nội tuyến ('TÀI LIỆU THAM KHẢO INT Sở thích (ID)') KHÔNG hoạt động. Điều này gần đây đã được báo cáo là một lỗi (http://bugs.mysql.com/bug.php?id=4919), vì vậy tôi chắc chắn họ sẽ sớm xử lý nó. –

Trả lời

28

Tạo bảng sở thích tương tự như này:

CREATE TABLE hobby (
    id INT NOT NULL AUTO_INCREMENT, 
    person_id INT NOT NULL, 
    hobby_name VARCHAR(255), 
    PRIMARY KEY(id), 
    FOREIGN KEY(person_id) REFERENCES person(id)) 
6

Dưới đây là một ví dụ directly from MySQL website:

CREATE TABLE parent (id INT NOT NULL, 
        PRIMARY KEY (id) 
) ENGINE=INNODB; 

CREATE TABLE child (id INT, parent_id INT, 
        INDEX par_ind (parent_id), 
        FOREIGN KEY (parent_id) REFERENCES parent(id) 
        ON DELETE CASCADE 
) ENGINE=INNODB; 
+0

"ON DELETE CASCADE" là gì? – sasori

+2

@sasori - điều đó có nghĩa là khi bạn xóa một bản ghi trong bảng cha, tất cả các bản ghi trong bảng con với tham chiếu fk cho phụ huynh cũng sẽ bị xóa. điều này được gọi là "Xóa tầng". –

6
CREATE TABLE person (person_id INT NOT NULL, 
PRIMARY KEY (person_id)); 

CREATE TABLE hobby (hobby_id INT NOT NULL, person_id INT NOT NULL, 
PRIMARY KEY(hobby_id), 
FOREIGN KEY(person_id) REFERENCES person(person_id)); 

Các từ khóa tài liệu tham khảo được sử dụng để xác định những bảng và cột được sử dụng trong một mối quan hệ khóa ngoại. Điều này có nghĩa rằng một bản ghi trong bảng sở thích phải có một person_id tồn tại trong bảng người hoặc người khác tại thời điểm chèn, bạn sẽ nhận được một lỗi mà khóa không tồn tại.

Để trả lời câu hỏi của bạn ở trên về "ON DELETE CASCADE", nó cho phép bạn xóa bản ghi khóa chính (người) và các bản ghi con tương ứng (theo sở thích) mà không phải xóa tất cả các bản ghi con đầu tiên.

Để làm rõ, nếu bạn có con hồ sơ kèm theo một mục khóa chính và bạn cố gắng để xóa các entry khóa chính như:

DELETE FROM person where person_id = 1; 

mà không có DELETE ON CASCADE, bạn sẽ nhận được một lỗi nếu có hồ sơ trong sở thích có person_id của 1. Bạn sẽ xóa tất cả các hồ sơ đầu tiên trước khi thực hiện xóa ở trên. Với DELETE ON CASCADE được sử dụng, xóa ở trên sẽ thành công và tự động xóa bất kỳ và tất cả các bản ghi từ bảng sở thích bảng được liên kết với person_id bị xóa khỏi bảng khóa chính.

1

Từ khóa tham chiếu được sử dụng thực sự để biết vị trí khóa ngoại đã đến. Điều đó có nghĩa đó là tên bảng và tên của cái này trong bảng đó là gì.

Tôi nói điều này là đúng:

CREATE TABLE person (person_id INT NOT NULL, 
PRIMARY KEY (person_id)); 

CREATE TABLE hobby (hobby_id INT NOT NULL, person_id INT NOT NULL, 
PRIMARY KEY(hobby_id), 
FOREIGN KEY(person_id) REFERENCES person(person_id)); 

Sau đó, nhìn vào dòng này: FOREIGN KEY (Person_Id) Tài liệu tham khảo người (Person_Id));

Ở đây person_id là khóa ngoại và nó đến từ bảng người và trong bảng đó tên là person_id ... Vậy đó.

-1

Dưới đây là ví dụ về cách bạn có thể sử dụng.

create table hobby(id int references person(id),person_id int,hobby_varchar(20), primary key(id)); 

Cho ý nghĩa của nó, references cho phép chúng tôi chỉ định cột bảng đích mà khóa ngoại được đề cập.

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