1

从 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问题不在于前者,而在于后者。

4

1 回答 1

3

从我从 MySQL 网站和 Dev 博客中收集到的信息:

与 InnoDB 中的外键实现的一个重要区别是MySQL 集群不支持从数据节点本身更新主键- 而是使用 DELETE 后跟 INSERT 操作模拟 UPDATE。因此,如果父引用使用主键,则 UPDATE 操作将返回错误,除非使用 CASCADE 操作,在这种情况下,删除操作将导致子表中的相应行被删除。工程团队计划在随后的预览版中改变这种行为

尚未确认是否支持此类操作。

于 2013-02-15T10:43:35.930 回答