2013-07-17 34 views
23
CREATE DATABASE my_db; 

CREATE TABLE class (classID int NOT NULL AUTO_INCREMENT, 
nameClass varchar(255), 
classLeader varchar(255), 
FOREIGN KEY (classLeader) REFERENCES student(studentID), 
PRIMARY KEY (classID)); 

CREATE TABLE student (studentID int NOT NULL AUTO_INCREMENT, 
lastName varchar(255), 
firstName varchar(255), 
classID int, 
FOREIGN KEY (classID) REFERENCES class(classID), 
PRIMARY KEY (studentID)); 

DBMSがエラーをチェックできるように外部キーを使用してテーブル間のデータの一貫性を保証しようとしています。しかし、何らかの理由でそれができないようです。エラーとは何ですか?そして代替手段はありますか?また、私は外部キーを持つテーブルを埋めると、私は外のキーのために予約されているフィールドを埋めることができません、右か?また、外部キーはキーとみなされますか?エラーコード:1215.外部キー制約(外部キー)を追加できません

答えて

35

最も可能性の高い問題は、この行です:

FOREIGN KEY (classLeader) REFERENCES student(studentID), 

classLeaderのデータ型はVARCHAR(255)です。これはに、参照される列のデータ型と一致しなければなりません。student.studentID。もちろん、studentテーブルが存在し、studentIDカラムが存在しなければならず、studentIDカラムはstudentテーブルのPRIMARY KEYでなければなりません(ただし、MySQLではこれがPRIMARY KEYではなくUNIQUE KEYであると考えています、あるいは単にそれにインデックスを持っている。)

にどのような場合には、どのようなここに欠けているデータ型の不一致がありますSHOW CREATE TABLE student;


から出力されます。

classLeader VARCHAR(255)列は、studentID INTへの外部キー参照にはなりません。

2つの列のデータ型が一致している必要があります。

+0

CREATE DATABASE my_db3; CREATE TABLEクラス(のclassIDがNOT NULL AUTO_INCREMENTをint型、 nameClassのVARCHAR(255)、 classLeader int型、 FOREIGN KEY(classLeader)REFERENCES学生(studentID)、 PRIMARY KEY(のclassID)); TABLE学生CREATE SHOW(studentIDはint NOT NULL AUTO_INCREMENT、 氏名はvarchar(255)、 のfirstNameのVARCHAR(255)、 のclassID int型、 FOREIGN KEY(のclassID)REFERENCESクラス(のclassID)、 PRIMARY KEYを(studentID)) ; –

+1

まだエラーが発生しています。 –

+0

@ GEORGEReed ..あなたが手に入れているエラーを投稿することができれば便利です。 – Rohan

7

あなたが原因studentIDclassLeaderFOREIGN KEY (classLeader) REFERENCES student(studentID)におけるデータ型で、このエラーを得ていることは、主キー列と外部キー列のdifferent.Datatypeが同じでなければなりません。

From MySQL Site:

Corresponding columns in the foreign key and the referenced key must have similar data types. 
The size and sign of integer types must be the same. 
The length of string types need not be the same. 
For nonbinary (character) string columns, the character set and collation must be the same. 
+3

+1これは質問に答えます。この答えは、エラーを引き起こす問題を識別します。 – spencer7593

+0

符号なしプロパティを使用してこの列を追加すると、このエラーが発生することもあります。両方の列は、符号付きまたは符号なしの同じ定義を持たなければなりません。 –

1

エラーが解決さ:

をテーブルの外部キーを作成するには、この

CREATE TABLE USERS_SO (
    USERNAME VARCHAR(10) NOT NULL, 
    PASSWORD VARCHAR(32) NOT NULL, 
    ENABLED SMALLINT, 
    PRIMARY KEY (USERNAME) 
); 

のように以下のコードは、罰金

CREATE TABLE AUTHORITIES_SO (
    USERNAME VARCHAR(10) NOT NULL, 
    AUTHORITY VARCHAR(10) NOT NULL, 
    FOREIGN KEY (USERNAME) REFERENCES USERS_SO(USERNAME) 
); 
0

の作品あなたは、SQLダンプのヘッダーとフッターを持っていることを確認しそうでなければ、データベースを復元するときに

ヘッダーは以下のようになりますエラーのすべての並べ替えが表示されます - :

/*!40101 SET @[email protected]@CHARACTER_SET_CLIENT */; 
/*!40101 SET @[email protected]@CHARACTER_SET_RESULTS */; 
/*!40101 SET @[email protected]@COLLATION_CONNECTION */; 
/*!40101 SET NAMES utf8 */; 
/*!40014 SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; 
/*!40101 SET @[email protected]@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; 
/*!40111 SET @[email protected]@SQL_NOTES, SQL_NOTES=0 */; 

とフッター以下のようになります - :

/*!40111 SET [email protected]_SQL_NOTES */; 
/*!40101 SET [email protected]_SQL_MODE */; 
/*!40014 SET [email protected]_FOREIGN_KEY_CHECKS */; 
/*!40101 SET [email protected]_CHARACTER_SET_CLIENT */; 
/*!40101 SET [email protected]_CHARACTER_SET_RESULTS */; 
/*!40101 SET [email protected]_COLLATION_CONNECTION */; 

は、上記

乾杯 S

を役に立てば幸い
0

キーの終了基準点を 'ユニーク'に設定

0

これは遅い回答ですが、ほとんど役に立ちません。

私は同じ問題に直面しました。しかし、ここではデータタイプも同じでした。

しかし、create tableステートメントを調べると、「MyISAM」というエンジンと「InnoDB」というエンジンを使用して作成された1つのテーブルが見つかりました。

SHOW CREATE TABLE <TABLE NAME> 

それから私は「InnoDBテーブル」に両方のテーブルエンジンを変更し、それが働いていた(私は外部キーを作成することができました)

0

はその後、チェックアウトクエリからEngine, CHARSET, COLLATEを削除します。わたしにはできる。

関連する問題