質問

外部のキーコントレントを追加しようとすると、このエラーが発生します。

#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)?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top