我正在尝试设置一个外键,并遇到问题(并获得非常有用的1064“你做错了什么”错误)
要创建的代码:
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;
答案 0 :(得分:2)
要强制使用外键约束,您需要使用Innodb而不是MyISAM。 MyISAM parses and then ignores foreign key constraints。
对于InnoDB以外的存储引擎,MySQL Server解析FOREIGN CREATE TABLE语句中的KEY语法,但不使用或存储它。
您还需要declare either a primary key constraint或引用列上的唯一约束。 (这里的“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;