2010-02-23 5 views
2
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 должно потерпеть неудачу, но на самом деле нет.Почему все еще возможно вставить внешний ключ, который не существует?

Почему?

ответ

4

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

Вы также должны сделать 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; 
+0

Почему «unsigned» необходимо для 'product_id', тогда как' id' является 'подписанным' – user198729

+0

Поэтому products.id = unsigned integer orders.products_id должно быть целым числом без знака. вставки в эту таблицу будет производить: ERROR 1452 (23000): Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не удается – Cez

+0

Это документированный, но _very_ плохо: http://dev.mysql.com/ doc/refman/5.1/en/innodb-foreign-key-constraints.html (поиск «встроенных спецификаций ССЫЛКИ») –

1

Внешние ключи поддерживаются только в том случае, если 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; 

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

+0

Это кажется правильным с http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key -constraints.html –

+0

@astander: Спасибо за внешний источник. Я искал его :) –

+0

Я пробовал обновленную версию, все еще не работаю, @ Ответ Айка Уокера работает, но пока не знаю причины. – user198729

Смежные вопросы