Spec-Zone .ru
спецификации, руководства, описания, API

3.6.6. Используя Внешние ключи

В MySQL, InnoDB табличная проверка поддержки ограничений внешнего ключа. См. Раздел 14.2," InnoDB Механизм хранения", и Раздел 1.8.5.4, "Различия во Внешнем ключе".

Ограничение внешнего ключа не требуется просто присоединиться к двум таблицам. Для механизмов хранения кроме InnoDB, возможно, определяя столбец использовать a REFERENCES tbl_name(col_name) пункт, который не имеет никакого фактического эффекта, и служит только в качестве записки или комментария Вам что столбец, который Вы в настоящий момент определяете, предназначается, чтобы обратиться к столбцу в другой таблице. Чрезвычайно важно понять при использовании этого синтаксиса что:

Можно использовать столбец столь создаваемый как объединяющий столбец, как показано здесь:

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 shirt\G*************************** 1. row ***************************Table: shirtCreate 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 таким образом как комментарий или "напоминание" в определении столбца работает с MyISAM таблицы.