4

CREATE...SELECTステートメントを使用して複製されたときに、ソーステーブルの外部キー制約がどうなるのか疑問に思っています。参照制約はコピーまたは無視されますか?

次に例を示します。

CREATE TABLE foo(a int, b int, PRIMARY KEY(a));
CREATE TABLE source(id int, a int, PRIMARY KEY(id), FOREIGN KEY(a) REFERENCES foo(a));

CREATE TABLE target SELECT * FROM source;

だから、私の質問は、aターゲットの属性も指しているのfoo(a)かどうかです。答えがベンダー固有の場合、MySQLの答えを探しています。

4

1 に答える 1

8

いいえ、でFK制約は作成されませんtarget。CREATE TABLE ... SELECTは、SELECT結果セットの列とデータ型を調べるだけで、新しいテーブルの定義を決定します。

CREATE TABLE ... LIKEを使用することで回避策が得られると思いましたが、MySQL 5.5でテストしたところ、外部キーも作成されませんでした。

CREATE TABLE target LIKE source;

外部キーはInnoDBストレージエンジンに実装されており、MySQLのストレージに依存しないレイヤーでは認識されないため、ストレージに依存しない.FRMファイルには表示されない可能性があります。

このバグは、CREATE TABLE ... LIKEが.FRMファイルをコピーするだけで実装されていることを確認しているようです:http://bugs.mysql.com/bug.php?id = 35526

しかし、言及された修正はMySQL 6.1ブランチに入れられ、そのブランチはずっと前に殺されました。

したがって、今のところ、外部キーを別のステップとして宣言する必要があります。将来、.FRMファイルがなくなることを理解しているので、CREATE TABLE...LIKEの動作を変更する必要があります。とにかく、それは今日あなたを助けません。

于 2012-11-20T22:45:11.403 に答える