2013-02-14 44 views
1

從版本7.3開始,MySQL Cluster應該能夠支持外鍵約束。但這裏發生了什麼:具有MySQL.Cluster(NDB)的外鍵

DROP TABLE IF EXISTS t2; 
DROP TABLE IF EXISTS t1; 

CREATE TABLE t1 (
id INT PRIMARY KEY 
) ENGINE='InnoDB'; 

CREATE TABLE t2 (
id INT PRIMARY KEY, 
t1id INT 
) ENGINE='InnoDB'; 

ALTER TABLE t2 
ADD CONSTRAINT t2t1 FOREIGN KEY (t1id) REFERENCES t1 (id) 
ON DELETE CASCADE ON UPDATE CASCADE; 

這是使用InnoDB,一切正常。現在有了NDB嘗試:

DROP TABLE IF EXISTS t2; 
DROP TABLE IF EXISTS t1; 

CREATE TABLE t1 (
id INT PRIMARY KEY 
) ENGINE='NDB'; 

CREATE TABLE t2 (
id INT PRIMARY KEY, 
t1id INT 
) ENGINE='NDB'; 

ALTER TABLE t2 
ADD CONSTRAINT t2t1 FOREIGN KEY (t1id) REFERENCES t1 (id) 
ON DELETE CASCADE ON UPDATE CASCADE; 

-- ERROR 150 (HY000): Cannot add foreign key constraint 

現在怪異的一部分:

DROP TABLE IF EXISTS t2; 
DROP TABLE IF EXISTS t1; 

CREATE TABLE t1 (
id INT UNIQUE KEY 
) ENGINE='NDB'; 

CREATE TABLE t2 (
id INT PRIMARY KEY, 
t1id INT 
) ENGINE='NDB'; 

ALTER TABLE t2 
ADD CONSTRAINT t2t1 FOREIGN KEY (t1id) REFERENCES t1 (id) 
ON DELETE CASCADE ON UPDATE CASCADE; 

作品就好了。

是否有任何規則說「使用NDB存儲引擎無法在外鍵約束中引用主鍵列」或「使用NDB您必須在外鍵約束中引用UNIQUE KEYS」?

爲了讓事情更奇怪:

如果通過

CREATE TABLE t1 (
id INT UNIQUE KEY NOT NULL 
) ENGINE='NDB'; 

取代T1的定義,你得到同樣的錯誤。

我在想,PRIMARY KEY意味着NOT NULL,問題不在於前者,而在於後者。

+0

你可以放棄'ON UPDATE CASCADE'子句並檢查? – SparKot 2013-02-14 15:18:19

+0

@DoSparKot:那真的有效。你知道爲什麼嗎? – Jens 2013-02-15 09:04:05

回答

3

從我從MySQL的網站和開發博客聚集:

與 InnoDB的外鍵實現需要注意的一個重要區別是,的MySQL Cluster不支持主要的更新從內部 鍵數據節點自身 - 而不是更新是 模擬與刪除,然後是INSERT操作。因此,如果父引用使用主密鑰 ,則除非使用CASCADE操作,否則UPDATE操作將返回錯誤,在這種情況下,刪除 操作將導致刪除子表 中的對應行。 工程團隊計劃在 後續預覽版本中更改此行爲。

這樣操作的支持尚未證實。

+0

因此,因爲'UPDATE t1 SET id = 2 WHERE id = 1'導致'DELETE FROM t1 WHERE id = 1; INSERT INTO t1(id)VALUES(2)'我的ON UPDATE'無效?即使我知道這種行爲,我也會猜想'ON UPDATE'可以被忽略。 – Jens 2013-02-18 07:04:07