從版本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
,問題不在於前者,而在於後者。
你可以放棄'ON UPDATE CASCADE'子句並檢查? – SparKot 2013-02-14 15:18:19
@DoSparKot:那真的有效。你知道爲什麼嗎? – Jens 2013-02-15 09:04:05