如何在MySQL中使用关键字'references'?

sas*_*ori 28 mysql reference

references创建表时关键字是如何使用的?

假设我想创建两个表person,hobby并且我希望业余爱好者表ID引用人的ID?

person table
- id
- name

hobby
- id
- person_id
- hobby_name
Run Code Online (Sandbox Code Playgroud)

我怎么做?

Håv*_*d S 33

与此类似地创建爱好表:

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))
Run Code Online (Sandbox Code Playgroud)


AJ.*_*AJ. 7

这是一个直接来自MySQL网站的例子:

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;
Run Code Online (Sandbox Code Playgroud)

  • @sasori - 这意味着当您删除表parent中的记录时,表child中包含对父项的fk引用的所有记录也将被删除.这被称为"级联删除". (2认同)

RC.*_*RC. 7

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));
Run Code Online (Sandbox Code Playgroud)

references关键字用于定义在外键关系中使用的表和列.这意味着爱好表中的记录必须具有person表中存在的person_id,否则在插入时您将收到该键不存在的错误.

要回答上面关于"ON DELETE CASCADE"的内容的问题,它允许您删除父键记录(亲自)及其相应的子记录(爱好),而不必先删除所有子记录.

为了澄清,如果您有子记录附加到主键条目,并且您尝试删除主键条目,如:

DELETE FROM person where person_id = 1;
Run Code Online (Sandbox Code Playgroud)

没有DELETE ON CASCADE,如果业余爱好中的任何记录的person_id为1,您将收到错误.在执行上述删除之前,您将首先删除所有这些记录.使用DELETE ON CASCADE时,上述删除将成功并自动删除链接到从主键表中删除的person_id的表爱好表中的任何和所有记录.