外部キーを作成するときのエラー
-
18-09-2019 - |
質問
外部のキーコントレントを追加しようとすると、このエラーが発生します。
#1005 - Can't create table './testtable/#sql-595_146.frm' (errno: 150)
そのプロジェクトが削除されたときにプロジェクトIDを共有するすべての画像に対して、削除カスケードを実行する必要があります。私の簡素化されたテーブル構造は次のとおりです。
CREATE TABLE IF NOT EXISTS `images` (
`image_id` mediumint(8) unsigned NOT NULL auto_increment,
`project_id` smallint(6) NOT NULL,
PRIMARY KEY (`image_id`),
KEY `project_id_ix` (`project_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=28 ;
CREATE TABLE IF NOT EXISTS `projects` (
`project_id` smallint(5) unsigned NOT NULL auto_increment,
PRIMARY KEY (`project_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ;
ここで、以下のクエリを実行して制約を追加すると、上記のエラーが発生してクエリが失敗します。誰かが助けることができますか?
ALTER TABLE `images` ADD CONSTRAINT `project_id_fk` FOREIGN KEY (`project_id`) REFERENCES `projects` (`project_id`) ON DELETE CASCADE;
どうもありがとう!
解決
変更 project_id
同じサイズの列 smallint(6)
(または5)。また、それらを署名または署名の両方にする必要があります。
... MySQLのWebサイトから次のように書かれています
外部キーと参照キーの対応する列は、innoDB内に同様の内部データ型を持つ必要があり、タイプ変換なしで比較できるようにする必要があります。整数タイプのサイズとサインは同じでなければなりません。文字列タイプの長さは同じではありません。非バイナリ(文字)文字列の列の場合、文字セットと照合は同じでなければなりません。
他のヒント
I thought the datatype needed to match. project_id is smallint(6) in one table and smallint(5) in the other.
Shouldn't the project_id's both be smallint(6)
?
所属していません StackOverflow