2012-01-16 47 views
0

3つのテーブル間で「ON DELETE CASCADEを」(複数あるが、これらに接続がまだ存在しない)列IDとMySQLの外部キーは、私は私のDBに3つのテーブルを持っている

  • テーブル「分子」
  • カラム "id"と "molecule_id"を持つ外部キーと、 "molecule.id"を参照するテーブル "descriptor"
  • カラム "id"と "descriptor_id"と "descriptor.id"を参照する外部キーとの "tDepDescriptor"

(e achテーブルには列がありますが、外字キーやそのようなものはありません)

すべての外部キーには「削除カスケード」が指定されています。すべてのIDは符号なしint(5)です。

"descriptor"と "tDepDescriptor"の参照項目がある "molecule"のエントリを削除しようとすると、外部キーが「更新時に制限されている」ように何も起こりません。与えられた。 "ディスクリプタ"のエントリを削除すると、 "tDepDescriptor"内の参照元がすべて削除されるように削除されます。 「分子」のエントリを「ディスクリプタ」に参照しているが、「ディスクリプタ」のエントリを参照していないエントリを「tDepDescriptor」に削除しようとすると同じことが起こります。 "on delete cascade"は2つのテーブルで動作しますが、3つのテーブルが関わっているときには "cascade"が渡されないようです。

テーブルの内容は次のとおりです。 「分子」のエントリを削除する場合、「ディスクリプタ」内のすべての参照項目が削除されます。したがって、「ディスクリプタ」内の削除されたエントリの1つに対する参照を有する「tDepDescriptor」のすべてのエントリも削除される。

MySQLサーバのバージョンは5.1で、エンジンはInnoDBの

であることは、希望の誰かが、この説明が煩雑になることを従うことができると私を助けることができるです。

// EDIT: 問題が見つかりました。 データベースではなく、phpMyAdminに問題があるようです。 PMAで削除をクリックしても機能しませんでしたが、手動でクエリをコーディングすると、3つのテーブルすべてがカスケードされました。不思議ですが、少なくとも私のテーブルは正しく動作することがわかります。

答えて

4

ON DELETE CASCADEオプションがあれば十分です。

は、テーブルを作成し、入力します:

CREATE TABLE molecule (
    id INT(11) NOT NULL, 
    PRIMARY KEY (id) 
) 
ENGINE = INNODB; 

CREATE TABLE descriptor (
    id INT(11) NOT NULL, 
    molecule_id INT(11) DEFAULT NULL, 
    PRIMARY KEY (id), 
    CONSTRAINT FK_descriptor_molecule_id FOREIGN KEY (molecule_id) 
    REFERENCES molecule(id) ON DELETE CASCADE ON UPDATE RESTRICT 
) 
ENGINE = INNODB; 

CREATE TABLE tdepdescriptor (
    id INT(11) NOT NULL, 
    descriptor_id INT(11) DEFAULT NULL, 
    PRIMARY KEY (id), 
    CONSTRAINT FK_tdepdescriptor_descriptor_id FOREIGN KEY (descriptor_id) 
    REFERENCES descriptor(id) ON DELETE CASCADE ON UPDATE RESTRICT 
) 
ENGINE = INNODB; 

INSERT INTO molecule VALUES 
    (1), 
    (2), 
    (3); 

INSERT INTO descriptor VALUES 
    (1, 1), 
    (2, 1), 
    (3, 2); 

INSERT INTO tdepdescriptor VALUES 
    (1, 1), 
    (2, 2), 
    (3, 3); 

は、1つの分子とそのすべての記述子とそのすべてのtdepdescriptor削除:この例を見てい

DELETE FROM molecule WHERE id = 1; 

SELECT * FROM molecule; 
+----+ 
| id | 
+----+ 
| 2 | 
| 3 | 
+----+ 

SELECT * FROM descriptor; 
+----+-------------+ 
| id | molecule_id | 
+----+-------------+ 
| 3 |   2 | 
+----+-------------+ 

SELECT * FROM tdepdescriptor; 
+----+---------------+ 
| id | descriptor_id | 
+----+---------------+ 
| 3 |    3 | 
+----+---------------+ 
0

を使用していることを確認してください。 Engine InnoDBは、更新/削除カスケードで外部キーを他のものと連動させるためにチェーン化されています。

create table test1 (
    #column definitions, including fk with on delete/update cascade 
) engine = "InnoDB"; 

私のexprience:

私のプロジェクトで同じ問題がありました。すでに開発されたデータベースがいくつかの部品を追加するために私に与えられました。テーブルには外部キーの削除/更新カスケードはありませんでした。私はそれらを加えた、私はcPanelのphpMyAdminの "クエリ"タブから別のテーブルを追加しました。

(優先順位)1-M(パッケージ)1-M(標準)すべてのUPDATE/DELETEカスケード上で

:そう私は関係を持っていました。しかし、私が "優先度"を削除するとき、 "標準"は削除されませんでした。 "InnoDB"エンジンで "優先順位"と "パッケージ"が存在し、 "標準"テーブルを作成したときにENGINEを指定しなかったので、デフォルトで "MyISAM"が使用されていました。 ENGINE = "InnoDB"と明示的に言及してテーブルを再作成すると、問題は解決されました。

関連する問題