この create table はエラー 150 をスローしています:
CREATE TABLE IF NOT EXISTS published(
isbn VARCHAR(13) NOT NULL,
publisherid INTEGER NOT NULL,
year INTEGER NOT NULL,
lastupdate TIMESTAMP NOT NULL,
lastupdateby INTEGER NOT NULL,
FOREIGN KEY (lastupdateby) REFERENCES librarians (librarianid),
FOREIGN KEY (isbn) REFERENCES books,
FOREIGN KEY (publisherid) REFERENCES publishers,
PRIMARY KEY (isbn, publisherid)
) ENGINE = INNODB;
参照するテーブル ( librarians
、books
、およびpublishers
) は、SQL がこのビットに達したときに既に作成されていることを確認しました。DDL は次のとおりです。
CREATE TABLE IF NOT EXISTS librarians(
librarianid INTEGER AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) UNIQUE NOT NULL,
password VARCHAR(255) NOT NULL,
canread BOOLEAN NOT NULL,
canwrite BOOLEAN NOT NULL,
canexec BOOLEAN NOT NULL,
lastupdate TIMESTAMP NOT NULL,
lastupdateby INTEGER NOT NULL,
FOREIGN KEY (lastupdateby) REFERENCES librarians (librarianid)
) ENGINE = INNODB;
CREATE TABLE IF NOT EXISTS books(
isbn VARCHAR(13) PRIMARY KEY,
title VARCHAR(255) NOT NULL,
lastupdate TIMESTAMP NOT NULL,
lastupdateby INTEGER NOT NULL,
FOREIGN KEY (lastupdateby) REFERENCES librarians (librarianid)
) ENGINE = INNODB;
CREATE TABLE IF NOT EXISTS publishers(
publisherid INTEGER PRIMARY KEY AUTO_INCREMENT,
publishername VARCHAR(255) UNIQUE NOT NULL,
lastupdate TIMESTAMP NOT NULL,
lastupdateby INTEGER NOT NULL,
FOREIGN KEY (lastupdateby) REFERENCES librarians (librarianid)
) ENGINE = INNODB;
さらに、ここで見つけた次のガイドラインを確認しました。
参照されるテーブルも InnoDB である必要があります。まあ、私はそれを明示的に指定しました。
参照されるテーブルには、インデックスと主キーが必要です。外部キー フィールドは、それぞれの参照テーブルの (唯一の) 主キーです。私がこの要件を誤解しない限り、それはそれを満たすはずです。
FK 列と参照される PK 列の SQL データ型は同一でなければなりません。こちらもチェックを間違えなければ大丈夫なはず。
lastupdateby INTEGER NOT NULL
-->librarianid INTEGER AUTO_INCREMENT PRIMARY KEY
isbn VARCHAR(13) NOT NULL
-->isbn VARCHAR(13) PRIMARY KEY
publisherid INTEGER NOT NULL
-->publisherid INTEGER PRIMARY KEY AUTO_INCREMENT
それで、私は何を逃したのですか?このエラー 150 の原因は何ですか?