2013-08-22 19 views
9

外部キーとしてvarcharカラムを持つテーブルを作成しようとしていますが、MySqlはテーブルの作成中にエラーが発生します。私のクエリは、このようなものです:外部キーとしてvarcharカラムを持つMySQLテーブル

CREATE TABLE network_classes (
    id TINYINT(1) UNSIGNED NOT NULL AUTO_INCREMENT, 
    category VARCHAR(80) NOT NULL, 
    PRIMARY KEY(id), 
    KEY `key_1` (`id`,`category`) 
) 
ENGINE=InnoDB; 


CREATE TABLE networks (
    id TINYINT(3) UNSIGNED NOT NULL AUTO_INCREMENT, 
    name VARCHAR(100) NOT NULL, 
    category VARCHAR(80) NOT NULL, 
    director_id TINYINT(3) UNSIGNED NULL, 
    director_name VARCHAR(100) NULL, 
    description VARCHAR(1000) NULL, 
    last_modified TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, 
    user_id SMALLINT UNSIGNED NULL, 
    PRIMARY KEY(id), 
    KEY `networks_fk1` (`category`), 
    CONSTRAINT `networks_fk1` FOREIGN KEY (`category`) REFERENCES `network_classes` (`category`) ON DELETE NO ACTION, 
    INDEX networks_index2471(name), 
    INDEX networks_index2472(director_id, director_name) 
) 
ENGINE=InnoDB; 

と私はこのエラーを取得する:

[Err] 1215 - Cannot add foreign key constraint 

私は、MySQL 5.6.12を使用しています。クエリを修正するにはどうすればよいですか?あなたはnetwork_classessの代わりに、(自分の作成テーブル・スクリプトのように)network_classesを使用していた

CONSTRAINT `networks_fk1` FOREIGN KEY (`category`) 
REFERENCES `network_classess` (`category`) ON DELETE NO ACTION, 

答えて

16

外部キーでは、一意のフィールドを参照することしかできません。カテゴリフィールドが一意になるように

CREATE TABLE network_classes (
    id TINYINT(1) UNSIGNED NOT NULL AUTO_INCREMENT, 
    category VARCHAR(80) NOT NULL, 
    PRIMARY KEY(id), 
    UNIQUE KEY `category_UNIQUE` (`category`), 
    KEY `key_1` (`id`,`category`) 
) 
ENGINE=InnoDB; 


CREATE TABLE networks (
    id TINYINT(3) UNSIGNED NOT NULL AUTO_INCREMENT, 
    name VARCHAR(100) NOT NULL, 
    category VARCHAR(80) NOT NULL, 
    director_id TINYINT(3) UNSIGNED NULL, 
    director_name VARCHAR(100) NULL, 
    description VARCHAR(1000) NULL, 
    last_modified TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, 
    user_id SMALLINT UNSIGNED NULL, 
    PRIMARY KEY(id), 
    KEY `networks_fk1` (`category`), 
    CONSTRAINT `networks_fk1` FOREIGN KEY (`category`) REFERENCES `network_classes` (`category`) ON DELETE NO ACTION, 
    INDEX networks_index2471(name), 
    INDEX networks_index2472(director_id, director_name) 
) 
ENGINE=InnoDB; 

の下にあなたは、あなたが

0

、そのテーブルが存在しません。あなたの制約の

EDIT

名は、キー(networks_fk1)の変化のものと同じです。

私はあなたのDDLをよく読んでいます。

あなたのテーブルnetwork_classesはプライマリキーIDを持っていますので、外部キーとしてIDフィールドをリンクするフィールドを入れて、カテゴリフィールドをテーブルネットワークに表示してはいけませんが、私はfk_network_classをint同じ大きさの2つのVARCHAR列タイプが一致しない理由)network_classesのID()

+0

たい外部キーを追加することができるはずのように、あなたのnetwork_classesテーブルを変更し、私はそれを修正したが、まだあなたのnetwork_classessが空である –

+0

同じ問題を持っています?別のことは、複合主キーを定義する場合、外部キーは等しくなければなりません(エラーには影響ありません) –

+0

はい、そうです。あなたの側でクエリを実行していただけますか?理論的想像よりも実用的な解決策を探しています。 –

5

column types in the table and the referenced table do not match for constraint

に連結されましたか?もちろん答えは明白な照合です。新しいテーブルでは、参照されるテーブルのようにASCIIではなくUTF-8であることが分かりました。アスキーに変更されました。

+0

両方とも同じタイプ(デフォルトタイプ)を使用しています。あなたはそれをどう言う!!?? –

+0

も言及する価値があります。両方がInnoDBテーブルであることを確認してください –

1

FOREIGN KEYのターゲットにインデックスを付ける必要があります。通常はPRIMARY KEYなので、これは問題ではありませんが、あなたのケースではそうではありません(コンポジットキーの一部ですが、十分ではありません)。

network_classesでインデックスを作成してください。 categoryフィールド:

CREATE INDEX category_idx ON network_classes(category); 

は、その後、あなたのnetworksテーブルを再作成します。

+0

Jeremyさん、ありがとうございました。私はインデックスを作成し、それを解決しました。 –

関連する問題