3.6.6 使用外键
在 MySQL 中,InnoDB
table 支持检查外键约束。参见第 14 章,InnoDB 存储引擎和第 1.8.2.3 节“外键约束差异”。
仅仅连接两个 table 并不需要外键约束。对于InnoDB
以外的存储引擎,可以在定义列以使用REFERENCES tbl_name(col_name)
子句时使用,该子句没有实际作用,并且仅作为备忘录或 Comments 给您,您当前定义的列旨在引用另一个 table 格中的一列。使用此语法时,必须意识到:
-
MySQL 不会执行任何形式的检查来确保*
col_name
实际上存在于tbl_name
(甚至是tbl_name
*本身是否存在)中。 -
MySQL 不会对*
tbl_name
*执行任何操作,例如删除行以响应对您定义的 table 中的行执行的操作;换句话说,此语法不会引起ON DELETE
或ON UPDATE
行为。 (尽管您可以将ON DELETE
或ON UPDATE
子句作为REFERENCES
子句的一部分编写,但也将忽略它.) -
该语法创建一个* column *;它不会创建任何类型的索引或键。
您可以使用这样创建的列作为联接列,如下所示:
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
子句不会显示在显示创建 table或DESCRIBE的输出中:
SHOW CREATE TABLE shirt\G
*************************** 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=latin1
以这种方式将REFERENCES
用作列定义中的 Comments 或“提醒”可用于MyISAM
table。