从 7.3 版开始,MySQL Cluster 应该能够进行外键约束。但这是发生的事情:
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”?
让事情变得更奇怪:
如果将 t1 的定义替换为
CREATE TABLE t1 (
id INT UNIQUE KEY NOT NULL
) ENGINE='NDB';
你得到同样的错误。
我认为这PRIMARY KEY
意味着NOT NULL
问题不在于前者,而在于后者。