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 サイトと開発ブログから収集したものから:

InnoDB での外部キー実装との注意すべき重要な違いは、MySQL Cluster がデータ ノード自体からの主キーの更新をサポートしていないことです。代わりに、UPDATE は DELETE とそれに続く INSERT 操作でエミュレートされます。したがって、親参照が主キーを使用している場合、UPDATE 操作はエラーを返します。ただし、CASCADE アクションを使用している場合を除きます。この場合、削除操作により、子テーブル内の対応する行が削除されます。エンジニアリング チームは、今後のプレビュー リリースでこの動作を変更する予定です。

このような操作のサポートはまだ確認されていません。

于 2013-02-15T10:43:35.930 に答える