Ошибка MySQL не может добавить ограничение внешнего ключа

что не так?

mysql> create table price(
    -> p_code char(1) not null,
    -> p_description varchar(20),
    -> p_rentfee decimal(2,2) not null,
    -> p_dylatefee decimal(2,2));
Query OK, 0 rows affected (0.18 sec)

mysql> create table movie(
    -> mv_no char(4) not null,
    -> mv_name varchar(50) not null,
    -> mv_year char(4) not null,
    -> mv_cost decimal(2,2) not null,
    -> mv_genre varchar(15) not null,
    -> p_code char(1) not null,
    -> foreign key (p_code) references price(p_code));
ERROR 1215 (HY000): Cannot add foreign key constraint

mysql>

Ответ 1

price.p_code не является основным ключом для price. Попробуйте:

create table price(
p_code char(1) not null PRIMARY KEY,
p_description varchar(20),
p_rentfee decimal(2,2) not null,
p_dylatefee decimal(2,2));

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

В некоторых СУБД, например SQL Server, вы можете ссылаться на столбец с уникальным индексом (не ключевым) (см. мы можем иметь внешний ключ, который не является первичным ключом в любая другая таблица?), но это нестандартное поведение.

Ответ 2

p_code должен быть основным ключом в вашей таблице price:

create table price(
-> p_code char(1) not null,
-> p_description varchar(20),
-> p_rentfee decimal(2,2) not null,
-> p_dylatefee decimal(2,2),
-> PRIMARY KEY ( p_code ));

Ответ 3

  • Двигатель должен быть таким же, например. InnoDB
  • Тип данных должен совпадать с той же длиной. например УАКСНАК (20)
  • Collation Колонка символов должна быть одинаковой. например utf8
    Watchout: Даже если ваши таблицы имеют одинаковое значение Collation, столбцы могут быть разными.
  • Уникальный. Внешний ключ должен ссылаться на поле, которое является уникальным (обычно закрытым ключом) в справочной таблице.

Ответ 4

установите ключ p_code, либо установите его как уникальный ключ или первичный ключ.

Ответ 5

  • Обозначенный столбец price.p_code должен быть уникальным (необходимо создать первичный или уникальный ключ).
  • Обе таблицы должны быть InnoDb, используйте ENGINE = INNODB в CREATE TABLE.

Ответ 6

Тип данных для дочернего столбца должен точно соответствовать родительскому столбцу. Например, поскольку price.p_code является char (1), movie.p_code также должен быть char (1), а price.p_code должен быть Первичным ключом или создавать индекс.