使用外键
在MySQL中,InnoDB
表支持检查外键约束。请参见InnoDB存储引擎,以及“外键约束差异”。
仅仅连接两个表并不需要外键约束。对于除以外的存储引擎InnoDB
,可以在定义列时使用没有实际作用的子句,该子句仅作为对您的备忘录或注释,您当前定义的该列打算引用其中的列。另一张桌子。使用此语法时,必须意识到:REFERENCES tbl_name(col_name)
- MySQL不执行任何形式的检查以确保其
col_name
实际存在tbl_name
(甚至tbl_name
本身存在)。 - MySQL不执行任何类型的操作,
tbl_name
例如响应定义的表中的行而删除行。换句话说,这种语法不引起ON DELETE
或ON UPDATE
行为的任何责任。(尽管您可以将ON DELETE
orON UPDATE
子句作为子句的一部分编写REFERENCES
,但也将忽略它。) - 此语法创建一列;它并不会创建任何类型的索引或关键的。
您可以使用这样创建的列作为联接列,如下所示:
CREATE TABLE person ( id SMALLINTUNSIGNED NOT NULLAUTO_INCREMENT ,name CHAR(60) NOT NULL,PRIMARY KEY (id) );CREATE TABLE shirt ( id SMALLINTUNSIGNED NOT NULLAUTO_INCREMENT , style ENUM('t-shirt', 'polo', 'dress') NOT NULL, color ENUM('red', 'blue', 'orange', 'white', 'black') NOT NULL,owner SMALLINTUNSIGNED NOT NULLREFERENCES person(id),PRIMARY KEY (id) );INSERT INTO personVALUES (NULL, 'Antonio Paz');SELECT @last := LAST_INSERT_ID();INSERT INTO shirtVALUES (NULL, 'polo', 'blue', @last), (NULL, 'dress', 'white', @last), (NULL, 't-shirt', 'blue', @last);INSERT INTO personVALUES (NULL, 'Lilliana Angelovska');SELECT @last := LAST_INSERT_ID();INSERT INTO shirtVALUES (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 pINNER JOIN shirt sON s.owner = p.idWHERE 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 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=utf8mb4
采用REFERENCES
这种方式作为注释或“提示”列定义与工作MyISAM
表。