0

私は外部キーを設定しようとしていますが、問題が発生しています (そして、非常に役立つ 1064 "you did something wrong" エラーが発生します)。

作成するコード:

CREATE TABLE `airport`(
`id` int primary key AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`rwyCount` int,
`lat` float(4),
`lon` float(4),
`type` int, 
FOREIGN KEY (type) REFERENCES apType(id),
)ENGINE=MyISAM DEFAULT CHARSET=latin1;

そのエラーを出さないようにする唯一の方法は、外部キー行を削除することです。ここで何が間違っていますか?

apType テーブルのコードは次のとおりです。非常に単純なものです。

CREATE TABLE `apType`(
`id` int AUTO_INCREMENT,
`type` varchar(255) NOT NULL
)ENGINE=MyISAM DEFAULT CHARSET=latin1;
4

1 に答える 1

2

外部キー制約を適用するには、MyISAM ではなく Innodb を使用する必要があります。MyISAM は、外部キー制約を解析してから無視します

InnoDB 以外のストレージ エンジンの場合、MySQL Server は CREATE TABLE ステートメントの FOREIGN KEY 構文を解析しますが、それを使用または保存しません。

また、参照列に対して主キー制約または一意制約を宣言する必要があります。(ここの「id」列。)

...システムは、参照される列が UNIQUE である、または NOT NULL と宣言されるという要件を強制しません。一意でないキーまたは NULL 値を含むキーへの外部キー参照の処理は、UPDATE や DELETE CASCADE などの操作に対して明確に定義されていません。UNIQUE (PRIMARY を含む) および NOT NULL キーのみを参照する外部キーを使用することをお勧めします。

CREATE TABLE `apType`(
  `id` int AUTO_INCREMENT,
  `type` varchar(255) NOT NULL,
  PRIMARY KEY (id)
)ENGINE=INNODB DEFAULT CHARSET=latin1;

MySQL では、主キー制約をインラインで宣言しないほうがよいでしょう。

CREATE TABLE `airport`(
  `id` int AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `rwyCount` int,
  `lat` float(4),
  `lon` float(4),
  `type` int, 
  PRIMARY KEY (id),
  FOREIGN KEY (type) REFERENCES apType(id)
)ENGINE=INNODB DEFAULT CHARSET=latin1;
于 2013-07-29T00:52:10.957 に答える