Проблема создания внешнего ключа в MySQL - PullRequest
0 голосов
/ 08 июня 2009

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

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

Спасибо.

Ответы [ 4 ]

3 голосов
/ 08 июня 2009

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

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

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

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

    mysql> SHOW CREATE TABLE <parent_table>;
    mysql> SHOW CREATE TABLE <child_table>;
    
  • Столбцы в ссылочной таблице должны быть самыми левыми столбцами ключа. Обычно это ПЕРВИЧНЫЙ КЛЮЧ, но InnoDB фактически позволяет им быть частью любого ключа.

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

  • Вы должны правильно получить синтаксис объявления ограничения . : -)

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

1 голос
/ 08 июня 2009

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

1 голос
/ 08 июня 2009

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

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 голосов
/ 08 июня 2009

Пример:

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
);

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

...