MySQL:即使使用相同的数据类型也无法添加外键约束

时间:2017-05-09 20:31:57

标签: mysql mysqli

| section | CREATE TABLE `section` (
  `CourseNumber` varchar(10) NOT NULL,
  `Quarter` varchar(10) NOT NULL,
  `RoomNumber` varchar(4) DEFAULT NULL,
  `DayTime` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`CourseNumber`,`Quarter`),
  CONSTRAINT `section_ibfk_1` FOREIGN KEY (`CourseNumber`) REFERENCES `Course` (`CourseNumber`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |


| enrollment | CREATE TABLE `enrollment` (
  `SSN` varchar(9) DEFAULT NULL,
  `CourseNumber` varchar(4) DEFAULT NULL,
  `Quarter` varchar(10) DEFAULT NULL,
  `Grade` varchar(1) DEFAULT NULL,
  KEY `SSN` (`SSN`),
  KEY `CourseNumber` (`CourseNumber`),
  CONSTRAINT `enrollment_ibfk_1` FOREIGN KEY (`SSN`) REFERENCES `Student` (`SSN`),
  CONSTRAINT `enrollment_ibfk_2` FOREIGN KEY (`CourseNumber`) REFERENCES `Course` (`CourseNumber`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |



mysql> alter table enrollment add foreign key(Quarter) references section(Quarter);
ERROR 1215 (HY000): Cannot add foreign key constraint

我是sql的初学者。我正在努力学习基本概念。 表Enrollment和Section中的列Quarter具有数据类型VARCHAR(10),因此我不确定导致错误的原因。请帮忙。

3 个答案:

答案 0 :(得分:0)

如果表中的数据不符合外键,则无法创建。 尝试

SET foreign_key_checks = 0;
alter table enrollment add foreign key(Quarter) references section(Quarter);
SET foreign_key_checks = 1;

但是我用它来删除表格,不知道在这种情况下会发生什么。

答案 1 :(得分:0)

这是一个双重问题......

  • Quarter尚未在目标表enrollment中编入索引。
  • Quarter也未在源表section中编入索引,尽管它是复合PRIMARY KEY的一部分以及CourseNumber

因此,如果您只想在Quarter表中引用section表中的enrollment,则需要:

ALTER TABLE `section` ADD INDEX( `Quarter`);
ALTER TABLE `enrollment` ADD INDEX( `Quarter`);

然后:

ALTER TABLE enrollment ADD FOREIGN KEY(`Quarter`) REFERENCES section(`Quarter`);


但是,如果您希望(CourseNumber, Quarter)作为复合外键,则需要在enrollment表中的两个字段上创建组合索引:

ALTER TABLE `enrollment` ADD INDEX( `CourseNumber`, `Quarter`);

并跟进:

ALTER TABLE `enrollment` ADD FOREIGN KEY( `CourseNumber`, `Quarter` ) 
                      REFERENCES section( `CourseNumber`, `Quarter` );

答案 2 :(得分:0)

必须是一些阻止创建的数据,正如其他人所说的那样。当我运行它时,这很好用:

CREATE TABLE `Course` (
  `CourseNumber` varchar(10) NOT NULL,
  PRIMARY KEY (`CourseNumber`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `Student` (
  `SSN` varchar(9) NOT NULL,
  PRIMARY KEY (`SSN`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `section` (
  `CourseNumber` varchar(10) NOT NULL,
  `Quarter` varchar(10) NOT NULL,
  `RoomNumber` varchar(4) DEFAULT NULL,
  `DayTime` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`CourseNumber`,`Quarter`),
  CONSTRAINT `section_ibfk_1` FOREIGN KEY (`CourseNumber`) REFERENCES `Course` (`CourseNumber`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


CREATE TABLE `enrollment` (
  `SSN` varchar(9) DEFAULT NULL,
  `CourseNumber` varchar(4) DEFAULT NULL,
  `Quarter` varchar(10) DEFAULT NULL,
  `Grade` varchar(1) DEFAULT NULL,
  KEY `SSN` (`SSN`),
  KEY `CourseNumber` (`CourseNumber`),
  CONSTRAINT `enrollment_ibfk_1` FOREIGN KEY (`SSN`) REFERENCES `Student` (`SSN`),
  CONSTRAINT `enrollment_ibfk_2` FOREIGN KEY (`CourseNumber`) REFERENCES `Course` (`CourseNumber`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;