創建表時,如何使用references
關鍵字?如何在MySQL中使用關鍵字'references'?
比方說,我想創建兩個表person
和hobby
,我希望愛好表ID引用人的ID?
person table
- id
- name
hobby
- id
- person_id
- hobby_name
我該怎麼做?
創建表時,如何使用references
關鍵字?如何在MySQL中使用關鍵字'references'?
比方說,我想創建兩個表person
和hobby
,我希望愛好表ID引用人的ID?
person table
- id
- name
hobby
- id
- person_id
- hobby_name
我該怎麼做?
創建嗜好表類似於此:
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))
下面是一個例子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;
什麼是「ON DELETE CASCADE」先生? – sasori 2010-02-03 13:51:50
@sasori - 這意味着當你刪除表中的一條記錄時,表中的所有記錄都會被刪除。這被稱爲「級聯刪除」。 – 2010-02-03 14:10:01
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));
的參考文獻關鍵字用來定義哪些表和列是在使用外鍵關係。這意味着愛好表中的記錄必須具有person表中存在的person_id,否則在插入時您將收到該關鍵字不存在的錯誤。
要回答上面有關「ON DELETE CASCADE」的作用的問題,它允許您刪除父鍵記錄(親自)並且它是相應的子記錄(在愛好中),而不必首先刪除所有子記錄。
爲了澄清,如果您有連接到一個主鍵條目兒童的記錄,並嘗試刪除像主鍵條目:
DELETE FROM person where person_id = 1;
而無需刪除CASCADE,您將收到如果任何錯誤愛好中的記錄具有1的person_id's。在執行上面的刪除操作之前,您應先刪除所有這些記錄。使用DELETE ON CASCADE時,上面的刪除操作將成功並自動刪除鏈接到將從主鍵表中刪除的person_id的表愛好表中的所有記錄。
引用關鍵字實際上用於知道外鍵到了哪裏。 這意味着哪個是表名,表中的名稱是什麼。
我說這是正確的:
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));
然後,看看這一行: 外鍵(爲person_id)參考人(爲person_id));
這裏person_id是外鍵,它來自person表,它的名字是person_id ... 就是這樣。
下面是一個如何使用它的例子。
create table hobby(id int references person(id),person_id int,hobby_varchar(20), primary key(id));
對於這意味着什麼,references
允許我們指定到一個外鍵指向目標表列。
值得注意的是,內聯FK('HobbyID INT REFERENCES Hobbies(ID)')不起作用。這最近被報告爲一個bug(http://bugs.mysql.com/bug.php?id=4919),所以我確信他們很快就會處理它。 – 2013-10-09 16:03:56