2014-10-30 45 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解析,但被所有存儲引擎忽略(到目前爲止)。