2017-05-09 7 views
0
| 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)があります。そのため、何が原因でエラーが発生するのかわかりません。助けてください。MySQL:同じデータ型の場合でも外部キー制約を追加できません。

+0

データが新しい制約に違反しているのでしょうか? –

答えて

0

テーブルに外部キーを尊重しないデータがある場合は作成できません。

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

を試してみてくださいしかし、私はテーブルを削除するために、これを使用している、この場合に何が起こるか分かりません。

0

これは2倍の問題ですが...

  • Quarterはすでにターゲット表enrollmentにインデックス化されていません。
  • Quarterも、ソース表sectionでは索引付けされていませんが、PRIMARY KEYの部分とCourseNumberの部分です。だから、

あなただけenrollmentテーブルで参照することがQuartersectionからテーブルをしたい場合は、次の作業が必要になるでしょう:

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テーブル内の2つのフィールドの組み合わせのインデックスを作成する必要があります:

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

をし、それをフォローアップ:

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

私の 'SSN'、' CourseNumber'は何のエラーも起こさないが、 'Quarter'が問題を引き起こすがSSNと' CourseNumber'を引き起こさないのはなぜですか? –

+0

暗黙的にインデックスを作成する 'KEY SSN(SSN)'があるので、 –

+1

MySQLは自動的に参照テーブルにインデックスを作成するので、手動でインデックスを 'section'に追加すればよいことに注意してください。 – Barmar

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; 
関連する問題