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
Ответы
Ответ 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)