| 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),因此我不确定导致错误的原因。请帮忙。
答案 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;