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

Код ошибки: 1215. Невозможно добавить ограничение внешнего ключа (внешние ключи)

CREATE DATABASE my_db;

CREATE TABLE class (
  classID int NOT NULL AUTO_INCREMENT,
  nameClass varchar(255),
  classLeader varchar(255),
  FOREIGN KEY (classLeader) REFERENCES student(studentID),
  PRIMARY KEY (classID));

CREATE TABLE student (
  studentID int NOT NULL AUTO_INCREMENT,
  lastName varchar(255),
  firstName varchar(255),
  classID int,
  FOREIGN KEY (classID) REFERENCES class(classID),
  PRIMARY KEY (studentID));

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

4b9b3361

Ответ 1

Наиболее вероятной проблемой является эта строка:

FOREIGN KEY (classLeader) REFERENCES student(studentID),

Тип данных классаLeader - VARCHAR (255). Это должно соответствовать типу данных ссылочного столбца... student.studentID. И, конечно, таблица student должна существовать, а столбец studentID должен существовать, а столбец studentID должен быть PRIMARY KEY таблицы учеников (хотя я считаю, что MySQL позволяет это быть УНИКАЛЬНЫМ КЛЮЧОМ, а не PRIMARY KEY, или даже просто иметь индекс на нем.)

В любом случае, что здесь отсутствует, это вывод из SHOW CREATE TABLE student;


Там несовпадение типа данных.

Столбец classLeader VARCHAR(255) не может быть ссылкой внешнего ключа на studentID INT.

Типы данных двух столбцов должны совпадать.

Ответ 2

Вы получаете эту ошибку из-за FOREIGN KEY (classLeader) REFERENCES student(studentID) тип данных studentID и classLeader различен. Тип столбца первичного ключа и столбца внешнего ключа должен быть таким же.

От сайта MySQL:

Corresponding columns in the foreign key and the referenced key must have similar data types. 
The size and sign of integer types must be the same. 
The length of string types need not be the same. 
For nonbinary (character) string columns, the character set and collation must be the same.

Ответ 3

Хотя это поздний ответ, я надеюсь, что это поможет немногим людям.

Я столкнулся с той же проблемой. Но здесь типы данных были одинаковыми.

Но, когда я проверил инструкцию create table, я обнаружил, что одна таблица, созданная с помощью движка под названием "MyISAM", а другая - с помощью "InnoDB".

SHOW CREATE TABLE <TABLE NAME>

Затем я изменил оба движка таблиц на "InnoDB", и он работал (я смог создать внешний ключ)

Ответ 4

Ошибка решена:

Чтобы создать внешний ключ для таблицы, такой как

CREATE TABLE USERS_SO (
    USERNAME VARCHAR(10) NOT NULL,
    PASSWORD VARCHAR(32) NOT NULL,
    ENABLED SMALLINT,
    PRIMARY KEY (USERNAME)
);

Приведенный ниже код работает отлично

CREATE TABLE AUTHORITIES_SO (
    USERNAME VARCHAR(10) NOT NULL,
    AUTHORITY VARCHAR(10) NOT NULL,
    FOREIGN KEY (USERNAME) REFERENCES USERS_SO(USERNAME)
);

Ответ 5

Убедитесь, что у вас есть верхний и нижний колонтитулы в sql dump, иначе вы увидите всевозможные ошибки при восстановлении базы данных

Заголовок должен выглядеть примерно так:

/*!40101 SET @[email protected]@CHARACTER_SET_CLIENT */;
/*!40101 SET @[email protected]@CHARACTER_SET_RESULTS */;
/*!40101 SET @[email protected]@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40014 SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @[email protected]@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @[email protected]@SQL_NOTES, SQL_NOTES=0 */;

и нижний колонтитул должен выглядеть примерно так:

/*!40111 SET [email protected]_SQL_NOTES */;
/*!40101 SET [email protected]_SQL_MODE */;
/*!40014 SET [email protected]_FOREIGN_KEY_CHECKS */;
/*!40101 SET [email protected]_CHARACTER_SET_CLIENT */;
/*!40101 SET [email protected]_CHARACTER_SET_RESULTS */;
/*!40101 SET [email protected]_COLLATION_CONNECTION */;

Надеемся, что это поможет

Приветствия S

Ответ 6

Убедитесь, что ваша таблица использует движок InnoDB

Во-первых, проверьте, является ли двигатель INNODB или нет:

SHOW CREATE TABLE yourtable

Если нет, поменяйте движок на InnoDB:

ALTER TABLE yourtable ENGINE=INNODB;

Ответ 7

Установите конечную опорную точку ключа в значение "Уникальный"

Ответ 8

Удалите Engine, CHARSET, COLLATE из Query, затем оформите заказ. Меня устраивает.