MYSQL外键问题

时间:2013-07-28 19:58:49

标签: mysql sql database constraints

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

1 个答案:

答案 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;