web-dev-qa-db-ja.com

MariaDB:FOREIGN KEYを追加するためのALTER TABLE構文?

次のステートメントの何が問題になっていますか?

ALTER TABLE submittedForecast
  ADD CONSTRAINT FOREIGN KEY (data) REFERENCES blobs (id);

私が得ているエラーメッセージは

Can't create table `fcdemo`.`#sql-664_b` (errno: 150 "Foreign key constraint is incorrectly formed")
10
user1774051

これは私にとってMariaDB 10.1.8で機能します。

CREATE TABLE `submittedforecast` (
    `id` INT(11) NOT NULL,
    `data` INT(11) NOT NULL,
    PRIMARY KEY (`id`),
    INDEX `data` (`data`)
) ENGINE=InnoDB;    
CREATE TABLE `blobs` (
    `id` INT(11) NOT NULL,
    `content` BLOB NOT NULL,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB;
ALTER TABLE submittedForecast
  ADD CONSTRAINT FOREIGN KEY (data) REFERENCES blobs (id);

MariaDBのバージョン番号と、submittedForecastおよびblobsCREATE TABLEステートメントを含む完全な例を提供できますか?

7
Julian Ladisch

これをすでに解決したかどうかはわかりませんが、エンジンと照合順序の両方がテーブル間で一致していることを確認してください(例:latin1からlatin1およびInnoDBからInnoDB)。

私は同じ問題を抱えていたので、これらを切り替えることでうまく動作しました。

3
David Arguedas

同じ問題が発生し、テーブル構造を調べたところ、子テーブルの外部キー句が親テーブルの主キーを参照していないことがわかりました。親テーブルの主キーを参照するように変更すると、エラーは発生しなくなりました。

1
JavaTec

私は同じエラーがあり、実際にはかなり簡単に解決できます、あなたは制約に名前を付けています、これはこのようなことをするべきです:

ALTER TABLE submittedForecast ADD CONSTRAINT `fk_submittedForecast` 
  FOREIGN KEY (data) REFERENCES blobs (id)

さらにまとまりが必要な場合は、クエリの最後に追加します

 ON DELETE CASCADE ON UPDATE RESTRICT

これは別のフィールドのエラーである可能性もあるため、テーブルキーと外部キーが同じタイプであり、同じ属性を持っているかどうかを確認してください。

0
jogarcia