Ошибка ограничения внешнего ключа

Я пытаюсь отладить простую базу данных SQL. Я получаю ошибку, которая говорит

SQL query:


CREATE TABLE Groups (
  groupId            int(11) NOT NULL AUTO_INCREMENT,
  leaderId           int(11) NOT NULL COLLATE utf8_unicode_ci,
  sportId            int(11) NOT NULL COLLATE utf8_unicode_ci,
  groupName          varchar(255) COLLATE utf8_unicode_ci,
  membersName        varchar(255) COLLATE utf8_unicode_ci,
  groupDes           TEXT CHARACTER SET latin1 COLLATE latin1_general_cs,
  dateCreated    TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (groupId),
  FOREIGN KEY (sportId) REFERENCES Sports(sportId),
  FOREIGN KEY (leaderId) REFERENCES Users(userId)
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
MySQL said: Documentation

#1215 - Cannot add foreign key constraint 

Я знаю, что это ИНОСТРАННЫЙ КЛЮЧ (sportId) ССЫЛКИ Sports(sportId), строка, потому что, когда я удаляю его, я не получаю ошибок, и все в порядке. Что-то может быть не так с моей спортивной таблицей или просто синтаксическая ошибка, но я не вижу этого. Кто-то, пожалуйста, скажите мне, что я схожу с ума, и это простая проблема синтаксиса. Вот полный файл базы данных, которую я пишу.

DROP DATABASE if EXISTS sqlfile;
CREATE DATABASE sqlfile;
USE sqlfile;

DROP TABLE if EXISTS Users;
CREATE TABLE Users (
  userId             int(11) NOT NULL AUTO_INCREMENT,
  userName           varchar (255) UNIQUE NOT NULL COLLATE utf8_unicode_ci,
  password           varchar(255) COLLATE utf8_unicode_ci,
  firstName          varchar(255) COLLATE utf8_unicode_ci,
  lastName           varchar(255) COLLATE utf8_unicode_ci,
  tel                char(10) COLLATE utf8_unicode_ci,
  dateCreated    TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (userId)
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE Groups (
  groupId            int(11) NOT NULL AUTO_INCREMENT,
  leaderId           int(11) NOT NULL COLLATE utf8_unicode_ci,
  sportId            int(11) NOT NULL COLLATE utf8_unicode_ci,
  groupName          varchar(255) COLLATE utf8_unicode_ci,
  membersName        varchar(255) COLLATE utf8_unicode_ci,
  groupDes           TEXT CHARACTER SET latin1 COLLATE latin1_general_cs,
  dateCreated    TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (groupId),
  FOREIGN KEY (sportId) REFERENCES Sports(sportId),
  FOREIGN KEY (leaderId) REFERENCES Users(userId)
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE Members (
  memberId           int(11) NOT NULL AUTO_INCREMENT,
  groupId            int(11) NOT NULL COLLATE utf8_unicode_ci,
  userId             int(11) NOT NULL COLLATE utf8_unicode_ci,
  dateCreated    TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (memberId),
  FOREIGN KEY (groupId) REFERENCES Groups(groupId),
  FOREIGN KEY (userId) REFERENCES Users(userId)
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE Sports (
  sportId            int(11) NOT NULL AUTO_INCREMENT,
  sportName          varchar(255) COLLATE utf8_unicode_ci,
  dateCreated    TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (sportId)
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

3 ответа

Решение

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

DROP TABLE if EXISTS Users;
CREATE TABLE Users (
....
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
CREATE TABLE Sports (
....
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
CREATE TABLE Groups (
....
  FOREIGN KEY (sportId) REFERENCES Sports(sportId),
  FOREIGN KEY (leaderId) REFERENCES Users(userId)
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE Members (
....
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

DEMO

Из изучения вывода MySQL Dump....

/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;

[your CREATEs here]

/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;

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

Вам нужно создать спортивную таблицу перед группами или добавить ограничение в конце после того, как у вас есть спортивная таблица.

DROP DATABASE if EXISTS classbash;
CREATE DATABASE classbash;
USE classbash;

DROP TABLE if EXISTS Users;
CREATE TABLE Users (
  userId             int(11) NOT NULL AUTO_INCREMENT,
  userName           varchar (255) UNIQUE NOT NULL COLLATE utf8_unicode_ci,
  password           varchar(255) COLLATE utf8_unicode_ci,
  firstName          varchar(255) COLLATE utf8_unicode_ci,
  lastName           varchar(255) COLLATE utf8_unicode_ci,
  tel                char(10) COLLATE utf8_unicode_ci,
  dateCreated    TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (userId)
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE Sports (
  sportId            int(11) NOT NULL AUTO_INCREMENT,
  sportName          varchar(255) COLLATE utf8_unicode_ci,
  dateCreated    TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (sportId)
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE Groups (
  groupId            int(11) NOT NULL AUTO_INCREMENT,
  leaderId           int(11) NOT NULL COLLATE utf8_unicode_ci,
  sportId            int(11) NOT NULL COLLATE utf8_unicode_ci,
  groupName          varchar(255) COLLATE utf8_unicode_ci,
  membersName        varchar(255) COLLATE utf8_unicode_ci,
  groupDes           TEXT CHARACTER SET latin1 COLLATE latin1_general_cs,
  dateCreated    TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (groupId),
  FOREIGN KEY (sportId) REFERENCES Sports(sportId),
  FOREIGN KEY (leaderId) REFERENCES Users(userId)
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE Members (
  memberId           int(11) NOT NULL AUTO_INCREMENT,
  groupId            int(11) NOT NULL COLLATE utf8_unicode_ci,
  userId             int(11) NOT NULL COLLATE utf8_unicode_ci,
  dateCreated    TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (memberId),
  FOREIGN KEY (groupId) REFERENCES Groups(groupId),
  FOREIGN KEY (userId) REFERENCES Users(userId)
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
Другие вопросы по тегам