web-dev-qa-db-ja.com

削除カスケードのMySQL。試験例

私はこのテスト問題について疑問に思っています。サンプルを自分で準備してテストしましたが、まだ答えがわからないと感じています。

以下で:

CREATE TABLE foo (
  id INT PRIMARY KEY AUTO_INCREMENT, 
  name INT
)

CREATE TABLE foo2 (
  id INT PRIMARY KEY AUTO_INCREMENT, 
  foo_id INT REFERENCES foo(id) ON DELETE CASCADE
)

私の知る限り、答えは次のとおりです。

a。2つのテーブルが作成されます

以下もありますが:

b。foo_idが2のテーブルfoo2の行が削除された場合、テーブルfooのid = 2の行は自動的に削除されます

d。テーブルfooのid = 2の行が削除された場合、テーブルfoo2のfoo_id = 2のすべての行が削除されます

私の例では、削除構文を使用していました。

DELETE FROM foo WHERE id = 2;
DELETE FROM foo2 WHERE foo_id = 2;

何らかの理由で、テーブル間の関係を見つけることができませんでした。 MySQLの設定があるか、おそらくON DELETE CASCADEテーブル作成クエリで適切に使用されていませんか?私は不思議に思っています...

24
Eae

回答d。ストレージエンジンが外部キー制約を実際にサポートおよび実施する場合にのみ、正しいです。

テーブルがEngine=MyISAMで作成されている場合、どちらもb。またはd。正しい。

テーブルがEngine=InnoDBで作成されている場合、 d。 正しい。

注意:

FOREIGN_KEY_CHECKS = 1;の場合にのみ、これはInnoDBにも当てはまります。 FOREIGN_KEY_CHECKS = 0の場合、親テーブル(foo)からのDELETEnot親テーブルから削除された行を参照する子テーブル(foo2)から行を削除します。

SHOW VARIABLES LIKE 'foreign_key_checks'(1 = ON、0 = OFF)からの出力でこれを確認します(通常のデフォルトでは、これがONになっています)。

SHOW CREATE TABLE fooからの出力は、テーブルが使用するエンジンを示します。

SHOW VARIABLES LIKE 'storage_engine'からの出力には、テーブルが作成され、エンジンが指定されていないときに使用されるデフォルトのエンジンが表示されます。

37
spencer7593

2つのテーブル間に関係があります。foo2作成コマンド... foo_id int references foo(id) on delete cascadeにあります。

MySQL外部キー制約リファレンス によると:

CASCADE:親テーブルから行を削除または更新し、子テーブルの一致する行を自動的に削除または更新します。 ON DELETE CASCADEとON UPDATE CASCADEの両方がサポートされています。

また、 MySQL Foreign Keys reference によると:

InnoDB以外のストレージエンジンの場合、列を定義するときにREFERENCES tbl_name(col_name)句を使用することができます。これは、実際の効果を持たず、列が現在定義しているのは、別のテーブルの列を参照することです

したがって、外部キーは子テーブルから親テーブルへのものであるため、fooを親テーブル、foo2子テーブル。したがって、fooから行を削除すると、削除がfoo2、InnoDBまたはそれをサポートする他のストレージエンジンを使用する場合。

14
Vic