2017-10-27 17 views
1

私はちょうどMariaDB内のMySQLファイルを実行しようとしているが、それは私に次のエラーを与える:ERROR 1005 (HY000) at line 14: Can't create table roundcube.calendars (errno: 150 "Foreign key constraint is incorrectly formed") SQLクエリだ外部キー制約が誤っ(MariaDBに)形成されて

https://pastebin.com/4FBA30JM は、残念ながら、私はできませんそれはちょっと書式設定を混乱させるので、ここに投稿してください。

+2

外部リンクに送信する代わりに、ここでコードを共有してください – Mureinik

答えて

2

ここではカレンダーのテーブル定義を以下に示します。

CREATE TABLE IF NOT EXISTS `calendars` (
    `calendar_id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT, 
    `user_id` int(10) UNSIGNED NOT NULL DEFAULT '0', 
    `name` varchar(255) NOT NULL, 
    `color` varchar(8) NOT NULL, 
    `showalarms` tinyint(1) NOT NULL DEFAULT '1', 
    PRIMARY KEY(`calendar_id`), 
    INDEX `user_name_idx` (`user_id`, `name`), 
    CONSTRAINT `fk_calendars_user_id` FOREIGN KEY (`user_id`) 
    REFERENCES `users`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE=INNODB CHARACTER SET utf8 COLLATE utf8_general_ci; 

私はサンドボックス内でこれをテストし、文が細かいです。それには何も問題はありません。

ただし、リンクされたコードサンプルにusersテーブルは表示されません。外部キーを使用してテーブルを作成する前に、次の条件が満たされている必要があります。

  • 参照テーブル(あなたの場合はusers)が存在する必要があります。
  • 参照先のテーブルは、InnoDBストレージエンジンを使用する必要があります。
  • 参照先の列(user_id)がテーブルに存在している必要があります。
  • 参照される列は、それを参照する外部キー列とまったく同じデータ型を持たなければなりません。あなたの場合、これはINT UNSIGNEDです(整数の長さの引数(10)はオプションであり、2つのテーブルで異なる場合があります)。
  • 参照する列は、KEYの左端の列でなければなりません。理想的には、標準SQLと互換性があるように、PRIMARY KEYまたはUNIQUE KEY全体である必要があります。技術的にも、InnoDBでは、外部キーが非固有キーを参照することもできますが、これはお勧めできません。

だから、少なくとも、すでにデータベース内の既存の以下のようなテーブルを持っている必要があります。

CREATE TABLE `users` (
    `user_id` int(10) UNSIGNED NOT NULL, 
    PRIMARY KEY (`user_id`) 
) ENGINE=INNODB CHARACTER SET utf8 COLLATE utf8_general_ci; 

私はあなたのカレンダーのテーブル定義がうまくいく前に、私のサンドボックス内でこのテーブルを作成する必要がありました。

+0

ありがとうございます!それが助けになりました。データベースを再チェックしてusersテーブルを見つけましたが、接頭辞がありますので、スクリプト全体のテーブルを置き換える必要があります。 –

関連する問題