2013-07-28 64 views
0

我想设置一个外键,并运行到问题(并获得了非常有益的1064“你做错了什么”错误)MYSQL外键的问题

代码来创建:

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; 
+3

的外键行的末尾删除逗号 – Gryphius

+0

完整的错误将是有益的另外;-) – Jonnny

+0

删除逗号,并得到:#1064 - 你在你的SQL语法错误;检查与您的MySQL服务器版本相对应的手册,以找到在第8行 –

回答

2

要强制执行外键约束,你需要使用InnoDB而非MyISAM数据。 MyISAM parses and then ignores foreign key constraints

对于比其他的InnoDB存储引擎,MySQL服务器解析国外 KEY语法在CREATE TABLE语句,但不使用或存放它。

您还需要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;