web-dev-qa-db-ja.com

外部キーとして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を使用しています。クエリを書き換えて修正するにはどうすればよいですか?

17
Hamid Ghorashi

一意のフィールドを参照する外部キーのみを持つことができます。以下のように、categoryフィールドが一意になるようにnetwork_classesテーブルを変更します。

 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;

その後、必要な外部キーを追加できるはずです

25
neildt

テーブルと参照されるテーブルの列タイプが制約と一致しません

同じサイズの2つのvarchar列が型で一致しないのはなぜですか?そしてもちろん、答えは明白な照合です。新しいテーブルでは、列は、参照されたテーブルのようにASCIIではなく、UTF-8だったことがわかりました。ASCIIに変更されて完了しました。

9
Ch Zeeshan

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

network_classes.categoryフィールドにインデックスを作成します。

CREATE INDEX category_idx ON network_classes(category);

次に、networksテーブルを再作成します。

2
Jeremy Smyth

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

network_classesの代わりにnetwork_classessを使用しているため(create tableスクリプトのように)、テーブルが存在しない。

[〜#〜]編集[〜#〜]

制約の名前は、キー(networks_fk1)の変更と同じです。

私はあなたのDDLをよく読みます。

テーブルnetwork_classesには主キーIDがあるため、idフィールドにリンクするフィールドを外部キーとして正しく配置します。カテゴリーフィールドはテーブルネットワークに表示されないようにする必要がありますが、fk_network_classを(intとして)idにリンクする必要があると思います(network_classesの)

0
Joe Taras