3.6.6使用外键

 

在MySQL中,InnoDB表支持检查外键约束。请参见 第15章,InnoDB存储引擎,以及 第1.7.2.3节“外键约束差异”

仅仅连接两个表并不需要外键约束。对于除以外的存储引擎 InnoDB,可以在定义列时使用 没有实际作用子句,该子句仅作为对您的备忘录或注释,您当前定义的该列打算引用其中的列。另一张桌子使用此语法时,必须意识到: REFERENCES tbl_name(col_name)

  • MySQL不执行任何形式的检查来确保它 col_name确实存在 tbl_name(甚至 tbl_name本身存在)。

  • MySQL不执行任何类型的操作, tbl_name例如响应定义的表中的行而删除行。换句话说,这种语法不引起ON DELETEON UPDATE行为的任何责任。(尽管您可以将ON DELETEor ON UPDATE子句编写为该REFERENCES子句的一部分,但也将其忽略。)

  • 此语法创建一它并 不会创建任何类型的索引或关键的。

您可以使用这样创建的列作为联接列,如下所示:

CREATE TABLE person (
    id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
    name CHAR(60) NOT NULL,
    PRIMARY KEY (id)
);

CREATE TABLE shirt (
    id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
    style ENUM('t-shirt', 'polo', 'dress') NOT NULL,
    color ENUM('red', 'blue', 'orange', 'white', 'black') NOT NULL,
    owner SMALLINT UNSIGNED NOT NULL REFERENCES person(id),
    PRIMARY KEY (id)
);

INSERT INTO person VALUES (NULL, 'Antonio Paz');

SELECT @last := LAST_INSERT_ID();

INSERT INTO shirt VALUES
(NULL, 'polo', 'blue', @last),
(NULL, 'dress', 'white', @last),
(NULL, 't-shirt', 'blue', @last);

INSERT INTO person VALUES (NULL, 'Lilliana Angelovska');

SELECT @last := LAST_INSERT_ID();

INSERT INTO shirt VALUES
(NULL, 'dress', 'orange', @last),
(NULL, 'polo', 'red', @last),
(NULL, 'dress', 'blue', @last),
(NULL, 't-shirt', 'white', @last);

SELECT * FROM person;
+----+---------------------+
| id | name                |
+----+---------------------+
|  1 | Antonio Paz         |
|  2 | Lilliana Angelovska |
+----+---------------------+

SELECT * FROM shirt;
+----+---------+--------+-------+
| id | style   | color  | owner |
+----+---------+--------+-------+
|  1 | polo    | blue   |     1 |
|  2 | dress   | white  |     1 |
|  3 | t-shirt | blue   |     1 |
|  4 | dress   | orange |     2 |
|  5 | polo    | red    |     2 |
|  6 | dress   | blue   |     2 |
|  7 | t-shirt | white  |     2 |
+----+---------+--------+-------+


SELECT s.* FROM person p INNER JOIN shirt s
   ON s.owner = p.id
 WHERE p.name LIKE 'Lilliana%'
   AND s.color <> 'white';

+----+-------+--------+-------+
| id | style | color  | owner |
+----+-------+--------+-------+
|  4 | dress | orange |     2 |
|  5 | polo  | red    |     2 |
|  6 | dress | blue   |     2 |
+----+-------+--------+-------+

以这种方式使用时,该REFERENCES 子句不会显示在SHOW CREATE TABLE或 的输出中 DESCRIBE

SHOW CREATE TABLE shirtG
*************************** 1. row ***************************
Table: shirt
Create Table: CREATE TABLE `shirt` (
`id` smallint(5) unsigned NOT NULL auto_increment,
`style` enum('t-shirt','polo','dress') NOT NULL,
`color` enum('red','blue','orange','white','black') NOT NULL,
`owner` smallint(5) unsigned NOT NULL,
PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4

在列定义 中REFERENCES以这种方式将其用作注释或“ 提醒 ”可与MyISAM表一起使用。

原文地址:https://www.cnblogs.com/owlin/p/13731008.html