24

I am wondering about this test question. I prepared the example myself and tested it but I still feel unsure of the answer.

With the following:

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
)

As far as I can see the answer is:

a. Two tables are created

Although there are also:

b. If a row in table foo2, with a foo_id of 2 is deleted, then the row with id=2 in the table foo is automatically deleted

d.If a row with id = 2 in table foo is deleted, all rows with foo_id = 2 in table foo2 are deleted

In my example I would have used the delete syntax:

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

For some reason I was unable to find any relationship between the tables although it seems like there should be one. Maybe there is some MySQL setting or perhaps is ON DELETE CASCADE not used properly in the table creation queries? I am left wondering...

4

2 に答える 2

38

答え d. ストレージ エンジンが実際に外部キー制約をサポートし、強制している場合にのみ、正しいです。

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

テーブルが で作成されている場合はEngine=InnoDBd. 正しい。

ノート:

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

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

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

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

于 2012-08-29T21:27:15.817 に答える
14

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

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

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

また、MySQL外部キーリファレンスによると:

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

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

于 2012-08-29T20:35:56.713 に答える