繁体   English   中英

错误外键约束

[英]Error foreign key constraint

我正在尝试调试一个简单的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 

我知道这是FOREIGN KEY(sportId)REFERENCES体育(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;

您需要首先创建体育表,以便在组表中具有外键引用

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转储输出....

/*!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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM