2017-12-31 287 views
1

class_membershistoryという2つのテーブルをMySQLデータベースに作成しようとしています。 class_members表には、メンバーに関する情報が含まれているとして作成されます。MySQLの外部キーエラー:テーブルを作成することができません

CREATE TABLE `class_members` (
    `id` int(11) NOT NULL, 
    `username` varchar(65) NOT NULL DEFAULT '', 
    `password` varchar(65) NOT NULL DEFAULT '', 
    `email` varchar(65) NOT NULL, 
    `mod_timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `username_UNIQUE` (`username`), 
    UNIQUE KEY `id_UNIQUE` (`id`), 
    UNIQUE KEY `email_UNIQUE` (`email`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 

class_membersテーブルが正常に作成されます。

historyテーブルを作成するときに問題が発生するのは、class_membersへの参照がforeign keyとなっています。

次のように私が使用するコマンドは次のとおりです。

CREATE TABLE `History` ( 
    `history_id` INT(11) NOT NULL AUTO_INCREMENT, 
    `username` VARCHAR(65) NOT NULL DEFAULT '', 
    `timestamp` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    `ip` VARCHAR(20) NOT NULL, 
    PRIMARY KEY (`history_id`), 
    CONSTRAINT `fk_history_member` FOREIGN KEY (`username`) 
    REFERENCES `class_members` (`username`) 
    ON UPDATE CASCADE); 

私は上記のコマンドを実行すると、私はこのエラーを取得:

ERROR 1005 (HY000): Can't create table 'testDB.History' (errno: 150) 

私はHistoryテーブル を読み取ることができない理由を見つけることを試みました(about ERROR 1005) なぜ分かりませんか


フォローアップのコメントでは、私は新しいデータベースを作成し、上記のコマンドを使用して作成しようとしたが、私はまだエラーが発生します。上のスクリーンショットでエラーが発生した理由を添付ピック 更新enter image description here


(解決)

を参照してください、私が見つかりました。これを解決するには、Historyテーブル作成コマンドの最後にENGINE=InnoDB DEFAULT CHARSET=utf8を追加する必要があります。

CREATE TABLE `History` ( 
    `history_id` INT(11) NOT NULL AUTO_INCREMENT, 
    `username` VARCHAR(65) NOT NULL DEFAULT '', 
    `timestamp` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    `ip` VARCHAR(20) NOT NULL, 
    PRIMARY KEY (`history_id`), 
    CONSTRAINT `fk_history_member` FOREIGN KEY (`username`) 
    REFERENCES `class_members` (`username`) 
    ON UPDATE CASCADE)ENGINE=InnoDB DEFAULT CHARSET=utf8; 

これは完全に機能します。

+0

私はちょうどそれを参照しませんでしたか?あなたがポイントを取得しようとするよりも助けることができれば感謝します –

+0

私はどのように私は重複としてフラグを立てるためのポイントを得るか分からないのですか?その投稿があなたを助けてくれたら助けになるか、間違っていると思いますか?しかし、それは、ターゲットとされた投稿は、多かれ少なかれあなたが参照した投稿から重複しているようです。 – Ivar

+0

私はグーグルでそれらのすべてを読んで、私はまだ質問をすることを考えていた問題を解決することができません。おそらく私の構文が間違っているか、私は外来キーに関するいくつかの概念を見逃していました。だからこそ私はコマンドを書こうとしたのです –

答えて

2

rextesterで質問する。

historyという名前の既存のテーブルがないことを確認してください。 I historyテーブルを再作成する場合は、私が取得:

Cannot delete or update a parent row: a foreign key constraint fails

その後、drop table if exists history;行を削除し、一度rextesterクエリを実行することによって、これを再現し、再びそれを実行することができます。

あなたが同じバッチで二回表を作成しようとする場合は、代わりにこれを取得する:

Table 'history' already exists

+0

しかし、私がこれを行っても、それはまだ失敗します:http://rextester.com/EKTL92226 –

+1

@TimBiegeleisen:もちろん、 'class_members'を削除する前に' history'を削除する必要があります:) – Andomar

+0

ニースキャッチ+1 ...これは考えていないでしょう –

0

私はあなたの問題は、インデックスの原点からだと思います。この方法でコードを試してください。

CREATE TABLE `class_members` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `username` varchar(65) NOT NULL DEFAULT '', 
    `password` varchar(65) NOT NULL DEFAULT '', 
    `email` varchar(65) NOT NULL, 
    `mod_timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `username_UNIQUE` (`username`), 
    UNIQUE KEY `id_UNIQUE` (`id`), 
    UNIQUE KEY `email_UNIQUE` (`email`), 
    INDEX `index_username` (`username`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

CREATE TABLE `History` ( 
    `history_id` INT(11) NOT NULL AUTO_INCREMENT, 
    `username` VARCHAR(65) NOT NULL DEFAULT '', 
    `timestamp` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    `ip` VARCHAR(20) NOT NULL, 
    PRIMARY KEY (`history_id`), 
    CONSTRAINT `fk_history_member` FOREIGN KEY (`username`) 
    REFERENCES `class_members` (`username`) 
    ON UPDATE CASCADE); 

SQLFiddleサンプルの場合。Click Here

関連する問題