2014-10-30 42 views
0

以下CREATE TABLE语句(简化的目的)当前MySQL 5.1中/ INNODB 效果很好:独立的外键声明失败

CREATE TABLE Employee ( 
    id INT NOT NULL PRIMARY KEY 
    ,boss INT REFERENCES Employee 
) 

现在我试图创建外键分开(执行DROP TABLE员工后):

CREATE TABLE Employee ( 
    id INT NOT NULL PRIMARY KEY 
    , boss INT 
    ,CONSTRAINT _FK_boss FOREIGN KEY(boss) REFERENCES Employee 
) 

这一次表创建失败消息

“无法添加˚F外部关键约束“。

顺便说一句:我已经做了一个DROP/CREATE DATABASE ...,修饰了约束标识符名称,根本没有成功。添加一个明确的"Engine innodb"也没有帮助。我的原始模式有两个截然不同的1:n相关表,表现出相同的行为。

据我所知 http://dev.mysql.com/doc/refman/5.1/en/create-table.html语法是正常的。

+0

请在使用前仔细阅读***使用的标签。这与* Microsoft SQL Server *无关。 – 2014-10-30 15:35:48

回答

0

外键约束要求的列;它不是可选的。这一声明将使宣言获得成功。

CREATE TABLE Employee (
id INT NOT NULL PRIMARY KEY 
, boss INT 
,CONSTRAINT _FK_boss FOREIGN KEY(boss) REFERENCES Employee (id) 
); 
1

的第一个例子工作。如果你运行SHOW CREATE TABLE,你会看到约束不存在。

MySQL解析内联外键声明,但InnoDB忽略它们。 InnoDB只支持表级约束。 InnoDB需要显式声明列,即使标准SQL声称它是可选的。

这是MySQL可插拔存储引擎架构的一个产物。 MySQL的存储独立层和每个单独的存储引擎层都有自己的SQL解析器,他们可能不同意他们支持多少标准语言。另一个例子是CHECK约束,它由MySQL解析,但被所有存储引擎忽略(到目前为止)。