0

我正在尝试设置外键,但遇到了问题(并得到了非常有用的 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;
4

1 回答 1

2

要强制执行外键约束,您需要使用 Innodb 而不是 MyISAM。MyISAM 解析然后忽略外键约束

对于 InnoDB 以外的存储引擎,MySQL Server 解析 CREATE TABLE 语句中的 FOREIGN KEY 语法,但不使用或存储它。

您还需要在引用的列上声明主键约束或唯一约束。(此处的“id”列。)

...系统不强制要求引用的列是唯一的或声明为 NOT NULL。对于 UPDATE 或 DELETE CASCADE 等操作,对非唯一键或包含 NULL 值的键的外键引用的处理没有明确定义。建议您使用仅引用 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 回答