web-dev-qa-db-ja.com

外部キー制約が正しく形成されていないため、テーブルの作成が失敗する

トピック

MariaDBInnoDB外部キーの問題

まず、InnoDBを初めて使用し、昨日投稿を読んで一日中過ごしたと言いたいのですが、今のところにたどり着くまでにさまざまなことを試しました。

データモデル内のいくつかのテーブルの中心となるテーブルがあります。したがって、これらの線に沿った何か:

create table users (id int not null auto_increment
, username varchar(255) NOT NULL
, password varchar(255) NOT NULL
, active int NOT NULL
, PRIMARY KEY (id))
ENGINE=InnoDB COLLATE=utf8_unicode_ci;

今週末、FKのいくつかのDELETE/UPDATE句をすばやくクリーンアップすることにしました...有名な最後の言葉...

関連する表の例はこちらです

create table athing (id int not null auto_increment
, name varchar(255) not null
, status varchar(255) not null
, created_by_user_id int 
, PRIMARY KEY (id)
, CONSTRAINT athing_fk1 FOREIGN KEY (created_by_user_id) REFERENCES users (id)
) ENGINE=InnoDB COLLATE=utf8_unicode_ci;

問題

「ATHING」テーブルのFKを変更して、ON DELETE SETNULLを含めました。その変更を保存すると、すべてが問題ないように見えました。私はこれを実行するためにHeidiSQLを使用していました。

簡単に言うと、テーブルのリストをトローリングしていて、USERSテーブルがなくなっているのを見てください。たくさんの読書と努力を通して、私は物事をきれいにすることができましたが、物事が本当に良いことを確実にするために私はUSERSテーブルを指しているすべてのFKを落とし、テーブルを落としました。

USERSテーブルを再作成しようとすると、次のエラーが表示されます。

ERROR 1005 (HY000): Can't create table `sprintdb`.`system_users` (errno: 150 "Foreign key constraint is incorrectly formed")

これを最初に試みた後に気付いたのは、すべてのFKを削除したと思っていたときに、いくつかのテーブルでそれらのキーをサポートするインデックスに特にキーの残りが残っていたということです。 INNODB_SYS_TABLESテーブルとINNODB_SYS_INDEXESテーブルをクエリすると、削除されたと思ったインデックスがこれらのシステムテーブルにまだ存在していることがわかります。

これを超える方法はありますか?ファイルシステムにあるかデータベース自体にあるかにかかわらず、先に進むために更新または削除する必要のある情報がどこかにあるように感じます...考えますか?

7
John

サードパーティのツールを使用してテーブルを作成し、既存のテーブルに対して制約を行っているときに、このメッセージを何度も受け取りました。これは、次の2つのいずれかです。

  • int列のサイズは異なります
  • int列には異なるフラグがあります(AUTO_INCREMENTなし)

例として、予期されたINT(10)ではなくINT(11)として列を作成するツールを使用してテーブルを作成しました。両方を作成するときにINTを選択しただけなのに、めちゃくちゃになってしまいました。理由を突き止めたことはありません。

簡単に言うと、テーブルを作成するときは、通常、INTサイズを明示的に指定するのが最善です。

あなたの場合、以下が機能するはずです:

create table users (id int(11) not null auto_increment
, username varchar(255) NOT NULL
, password varchar(255) NOT NULL
, active int NOT NULL
, PRIMARY KEY (id))
ENGINE=InnoDB COLLATE=utf8_unicode_ci;

create table athing (id int(11) not null auto_increment
, name varchar(255) not null
, status varchar(255) not null
, created_by_user_id int(11) not null
, PRIMARY KEY (id)
, CONSTRAINT athing_fk1 FOREIGN KEY (created_by_user_id) REFERENCES users (id)
) ENGINE=InnoDB COLLATE=utf8_unicode_ci;
15
h0tw1r3