Подтвердить что ты не робот

MySQL: ERROR 1215 (HY000): не удается добавить ограничение внешнего ключа

Я прочитал Концепции системы баз данных, 6-е издание, Silberschatz. Я собираюсь внедрить систему университетской базы данных, показанную в главе 2 в OS X в MySQL. Но мне сложно создать таблицу course. таблица department выглядит как

mysql> select * from department
    -> ;
+------------+----------+-----------+
| dept_name  | building | budget    |
+------------+----------+-----------+
| Biology    | Watson   |  90000.00 |
| Comp. Sci. | Taylor   | 100000.00 |
| Elec. Eng. | Taylor   |  85000.00 |
| Finance    | Painter  | 120000.00 |
| History    | Painter  |  50000.00 |
| Music      | Packard  |  80000.00 |
| Physics    | Watson   |  70000.00 |
+------------+----------+-----------+

mysql> show columns from department
    -> ;
+-----------+---------------+------+-----+---------+-------+
| Field     | Type          | Null | Key | Default | Extra |
+-----------+---------------+------+-----+---------+-------+
| dept_name | varchar(20)   | NO   | PRI |         |       |
| building  | varchar(15)   | YES  |     | NULL    |       |
| budget    | decimal(12,2) | YES  |     | NULL    |       |
+-----------+---------------+------+-----+---------+-------+

Создание таблицы course вызывает следующую ошибку.

mysql> create table course
    -> (course_id varchar(7),
    -> title varchar (50),
    -> dept_name varchar(20),
    -> credits numeric(2,0),
    -> primary key(course_id),
    -> foreign key (dept_name) references department);
ERROR 1215 (HY000): Cannot add foreign key constraint

после поиска google для ограничения внешнего ключа, я только что узнал, что слово "ограничение внешнего ключа" указывает, что данные из столбца внешнего ключа в таблице course должны существовать в столбце первичного ключа в таблице department. Но я должен был встретить эту ошибку при вставке данных.

Если нет, то почему автор заставляет меня выполнить этот оператор SQL?

Если я действительно выполняю ошибочный оператор SQL, должен ли я указывать dept_name в таблице курса в качестве внешнего ключа после вставки некоторых данных?

EDIT: ввод set foreign_key_checks=0 в mysql> не исправляет ошибку.

------------------------
LATEST FOREIGN KEY ERROR
------------------------
2013-09-21 16:02:20 132cbe000 Error in foreign key constraint of table university/course:
foreign key (dept_name) references department):
Syntax error close to:
)
mysql> set foreign_key_checks=0
    -> ;
Query OK, 0 rows affected (0.00 sec)
mysql> create table course
    -> (course_id varchar(7),
    -> title varchar(50),
    -> dept_name varchar(20),
    -> credits numeric(2,0),
    -> primary key(course_id),
    -> foreign key (dept_name) references department);
ERROR 1215 (HY000): Cannot add foreign key constraint
4b9b3361

Ответ 1

Синтаксис FOREIGN KEY для CREATE TABLE структурирован следующим образом:

FOREIGN KEY (index_col_name)
        REFERENCES table_name (index_col_name,...)

Итак, ваш MySQL DDL должен быть:

 create table course (
        course_id varchar(7),
        title varchar(50),
        dept_name varchar(20),
        credits numeric(2 , 0 ),
        primary key (course_id),
        FOREIGN KEY (dept_name)
            REFERENCES department (dept_name)
    );

Кроме того, в таблице department dept_name должно быть VARCHAR(20)

Более подробную информацию можно найти в документации MySQL

Ответ 2

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

SHOW ENGINE INNODB STATUS;

Наиболее распространенными причинами являются то, что при создании внешнего ключа как поле ссылки, так и поле внешнего ключа должны соответствовать:

  • Двигатель должен быть таким же, например. InnoDB
  • Тип данных должен совпадать с той же длиной.
    например VARCHAR (20) или INT (10) UNSIGNED
  • Значение должно быть одинаковым. например utf8
  • Уникальный. Внешний ключ должен ссылаться на поле, которое является уникальным (обычно частным) в справочной таблице.

Другая причина этой ошибки:
Вы определили условие SET NULL, хотя некоторые из столбцов определены как NOT NULL.

Ответ 3

Возможно, ваши столбцы dept_name имеют разные кодировки.

Вы можете попробовать изменить один или оба из них:

ALTER TABLE department MODIFY dept_name VARCHAR(20) CHARACTER SET utf8;
ALTER TABLE course MODIFY dept_name VARCHAR(20) CHARACTER SET utf8;

Ответ 4

foreign key (dept_name) references department

Этот синтаксис недействителен для MySQL. Вместо этого он должен быть:

foreign key (dept_name) references department(dept_name)

MySQL требует, чтобы dept_name использовался дважды. Один раз, чтобы определить внешний столбец и один раз, чтобы определить первичный столбец.

13.1.17.2. Использование ограничений FOREIGN KEY

... [существенный синтаксис определения ограничения внешнего ключа в операторе CREATE TABLE или ALTER TABLE выглядит следующим образом:

[CONSTRAINT [symbol]] FOREIGN KEY
    [index_name] (index_col_name, ...)
    REFERENCES tbl_name (index_col_name, ...)
    [ON DELETE reference_option]
    [ON UPDATE reference_option]

reference_option:
    RESTRICT | CASCADE | SET NULL | NO ACTION

Ответ 5

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

Я сделал ALTER TABLE и случайно удалил состояние первичного ключа в столбце и получил эту ошибку.

Ответ 6

ОШИБКА 1215 (HY000): не удается добавить ограничение внешнего ключа

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

Например:

alter table schoolPersons
         add index FKEF5AB5E532C8FBFA (student_id),
         add constraint FKEF5AB5E532C8FBFA
         foreign key (student_id)
         references student (id);
ERROR 1215 (HY000): Cannot add foreign key constraint

Это произошло потому, что поле student_id было определено как:

mysql> desc schoolPersons;
+--------------------+------------+------+-----+---------+----------------+
| Field              | Type       | Null | Key | Default | Extra          |
+--------------------+------------+------+-----+---------+----------------+
| student_id         | bigint(20) | YES  |     | NULL    |                |

в то время как поле id в таблице student было определено как:

mysql> desc persons;
+--------------+----------------------+------+-----+-------------------+-----------------+
| Field        | Type                 | Null | Key | Default           | Extra           |
+--------------+----------------------+------+-----+-------------------+-----------------+
| id           | int(10) unsigned     | NO   | PRI | NULL              | auto_increment  |

bigint(20) (сгенерированный с помощью Java long по hibernate) не совместим с int(10) unsigned (Java int).

Ответ 7

Я не встречаюсь с проблемой, как вы. Но я получаю то же сообщение ERROR. Поэтому я отмечаю это здесь для дружеской уверенности.

Проверьте кодировку двух таблиц, если тип столбца char или varchar. Я использую charset=gbk, но создаю новую таблицу, по умолчанию charset=utf8. Таким образом, кодировка не то же самое.

ERROR 1215 (HY000): Cannot add foreign key constraint

Чтобы решить, нужно использовать ту же кодировку. Например utf8.

Ответ 8

Просто добавьте 'unsigned' для ограничения FOREIGN

`FK` int(11) unsigned DEFAULT NULL,

Ответ 9

Ниже код работал у меня

set @@foreign_key_checks=0;
ALTER TABLE  `table1` ADD CONSTRAINT `table1_fk1` FOREIGN KEY (`coloumn`) REFERENCES `table2` (`id`) ON DELETE CASCADE;

Ответ 10

Стоит отметить, что эта ошибка также может произойти, если целевая таблица или столбец, который вы используете в части REFERENCES, просто не существует.

Ответ 11

Я не вижу, чтобы кто-то прямо заявлял об этом, и у меня было то же самое сообщение об ошибке, и моя проблема заключалась в том, что я пытался добавить внешний ключ в таблицу TEMPORARY. Что запрещено, как указано в руководстве

Отношения внешнего ключа включают родительскую таблицу, в которой хранятся центральные значения данных, и дочернюю таблицу с идентичными значениями, указывающими на ее родителя. Предложение FOREIGN KEY указывается в дочерней таблице. Родительская и дочерняя таблицы должны использовать один и тот же механизм хранения. Они не должны быть временными таблицами.

(акцент мой)

Ответ 12

Я столкнулся с той же проблемой. Не уверен, почему это работает, но это действительно работает: попробуйте добавить ENGINE INNODB после создания запроса.

mysql> create table course
-> (course_id varchar(7),
-> title varchar (50),
-> dept_name varchar(20),
-> credits numeric(2,0),
-> primary key(course_id),
-> foreign key (dept_name) references department) ENGINE INNODB;

Ответ 13

Даже если это не связано напрямую с вашей ситуацией, это может помочь другим читателям заметить, что вы можете получить точно такую же ошибку при выводе команды show engine innodb mstatus если вы не соблюдаете порядок создания таблиц базы данных; Это означает, что вы не должны добавлять внешнее ограничение, ссылающееся на таблицу, которая еще не существует. Справочная таблица должна существовать до той таблицы, которая на нее указывает.

Это также верно, когда соблюдается порядок создания таблицы, но не столбцы, включенные в ограничение внешнего ключа.

Ответ 14

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

enter image description here

Ответ 15

CONSTRAINT vendor_tbfk_1 FOREIGN KEY (V_CODE) REFERENCES vendor (V_CODE) ON UPDATE CASCADE

вот как это могло быть... посмотрите на часть столбца ссылки. (V_code)