Почему все еще возможно вставить внешний ключ, который не существует? - PullRequest
2 голосов
/ 23 февраля 2010
mysql>  create table products(id integer unsigned auto_increment primary key);
Query OK, 0 rows affected (0.05 sec)

mysql> CREATE TABLE orders (
    ->     id integer PRIMARY KEY auto_increment,
    ->     product_id integer REFERENCES products (id),
    ->     quantity integer,
    ->     INDEX product_id_idx (product_id)
    -> );
Query OK, 0 rows affected (0.05 sec)
mysql> insert into orders(product_id,quantity) value(1,1);
Query OK, 1 row affected (0.00 sec)

Поскольку продукт 1 не существует, оператор insert должен завершиться ошибкой, но на самом деле нет.

Почему?

Ответы [ 2 ]

4 голосов
/ 23 февраля 2010

Вы должны явно определить внешний ключ под определениями столбцов.

Вы также должны сделать product_id без знака, так как родительский ключ не подписан:

CREATE TABLE orders (
  id integer PRIMARY KEY auto_increment,
  product_id integer unsigned,
  quantity integer,
  INDEX product_id_idx (product_id),
  CONSTRAINT FK_ORDER_TO_PRODUCT FOREIGN KEY (product_id) REFERENCES products (id)
 ) engine=innodb;
1 голос
/ 23 февраля 2010

Внешние ключи поддерживаются только тогда, когда MySQL использует механизм хранения InnoDB .

MySQL использует MyISAM в качестве механизма хранения по умолчанию, где ограничения внешнего ключа просто игнорируются.

Попробуйте ваш пример со следующими таблицами:

CREATE TABLE products (
     id integer unsigned auto_increment primary key
) ENGINE=INNODB;

CREATE TABLE orders (
     id integer PRIMARY KEY auto_increment,
     product_id integer unsigned,
     quantity integer,
     INDEX product_id_idx (product_id),
     FOREIGN KEY (product_id) REFERENCES products (id)
) ENGINE=INNODB;

Также убедитесь, что ссылочные и ссылочные столбцы имеют одинаковый тип данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...