2009-06-08 3 views
0

Я столкнулся с этой статьей: http://dev.mysql.com/doc/refman/5.0/en/innodb-foreign-key-constraints.html, чтобы создать внешний ключ между двумя таблицами. Каждая попытка не срабатывает. Есть что-то, чего я не вижу ?!Проблема с созданием внешнего ключа в MySQL

Это действительно расстраивает, и я никогда не ожидал столкнуться с этой проблемой вообще!

Спасибо.

+1

... не могли бы вы показать нам, какие именно ваши попытки? –

ответ

1

Что именно происходит не так? Мы не можем вам помочь без подробностей ...

mysql> CREATE TABLE parent (id INT NOT NULL, 
    ->      PRIMARY KEY (id) 
    ->) ENGINE=INNODB; 
Query OK, 0 rows affected (0.01 sec) 
mysql> CREATE TABLE child (id INT, parent_id INT, 
    ->      INDEX par_ind (parent_id), 
    ->      FOREIGN KEY (parent_id) REFERENCES parent(id) 
    ->      ON DELETE CASCADE 
    ->) ENGINE=INNODB; 
Query OK, 0 rows affected (0.01 sec) 

Работает отлично для меня.

0

Пример:

use trading_research; 
drop table if exists stock_history; 
create table stock_history 
(
     company_id integer(4) NOT NULL, 
     price_date date NOT NULL, 
     primary key(company_id, price_date), 
     opening_price decimal(10,2) NULL, 
     closing_price decimal(10,2) NULL, 
     high_price decimal(10,2) NULL, 
     low_price decimal(10,2) NULL, 
     adjusted_closing_price decimal(10,2) NULL, 
     volume decimal(20, 2) NULL, 
     constraint foreign key (company_id) references stock_company (company_id) on delete cascade on update cascade 
); 

Если вы даете детали того, что вы пытаетесь и/или ошибки, которые вы получите, я могу помочь больше.

1

Следует помнить, что если вы являетесь дочерней таблицей/столбцом, значения, которые не существуют в родительской таблице/столбце, вы всегда получите ошибку.

3

Вы не показываете, что вы пробовали или какая ошибка, так что все ответы - только догадки.

Вот список вещей, которые должны быть истинными, прежде чем внешние ключи могут работать:

  • механизм хранения InnoDB должен быть включен.

    mysql> SHOW VARIABLES LIKE 'have_innodb'; 
    
  • Обе таблицы должны использовать механизм хранения InnoDB (MyISAM не поддерживает ограничения ссылочной целостности).

    mysql> SHOW CREATE TABLE <parent_table>; 
    mysql> SHOW CREATE TABLE <child_table>; 
    
  • Колонна (ы) в указанной таблице должен быть крайний левый столбец (ы) ключа. Обычно это PRIMARY KEY, но InnoDB фактически позволяет им быть частью любого ключа.

  • Ключевой столбец внешней и его ссылки первичный ключ столбец должен быть точно тот же тип данных (должен совпадать подписан против знака, междунар против BIGINT, струнный кодировкой и т.д.). Только длина строки может быть разной.

  • Вы должны получить constraint declaration syntax справа. :-)

  • Если вы добавляете ограничение в заполненную таблицу, все существующие значения должны удовлетворять ограничению (спасибо Jordan S. Jones 'answer в этой теме).

+0

Это заказ, в котором я бы постарался снять создание ключа. – Christian

+0

+1. Должен сказать, мне всегда нравятся ваши ответы. Они полны и очень хорошо осведомлены. –

+1

Я хотел бы подчеркнуть, что нужно следить за подписанными vs unsigned. Легко упустить и поймать меня. –

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