1

あるテーブルから特定のフィールドを削除しようとしていますが、別のテーブルから関連するすべてのフィールド(適切なfkを含むフィールド)を削除したいと考えています。

表1

      id | name | fname

表2

      id | table1Id | ...

table1Idは、Table1の主キーを参照する外部キーとして設定されています。ON DELETE CASCADE

これで私のコードは単純になり、次のようにTable1から行が削除されます。

function deleteWill($Id)
    {
        $stmt = $this->db->stmt_init();
        if($stmt->prepare('DELETE FROM Table1 where id= ?'))
        {
            $stmt->bind_param("i", $Id);
            $stmt->execute();
            $stmt->close();
            return true;
        }
        else
        {
            $stmt->close();
            return false;
        }
    }

ただし、このCASCADEオプションは機能しません。

Table2に同じfkを持つ複数の行があるという事実と関係がありますか?

もしそうなら、どうすればこれを修正して、Table2の関連するすべての行を削除できますか?

4

1 に答える 1

1

いいえ、Table2 の複数の行は問題になりません。

観察した動作の原因を特定するには、十分な情報がありません。ステートメントが正常に完了し、予想される行が Table1 から削除されているが、Table2 の一致する行が削除されていない場合...

次に、テーブルが InnoDB エンジンではなく MyISAM エンジンを使用していることが最初に疑われます。(MyISAM は外部キー制約を強制しませんが、InnoDB は強制します。) 以下からの出力:

SHOW CREATE TABLE Table1
SHOW CREATE TABLE Table2

どのエンジンが使用されているかを明らかにします。私はそこから始めます。それを検証するなど、他にもいくつかの可能性がありforeign_key_check = 1ます。


テーブルのエンジンを MyISAM から InnoDB に変更するには:

ALTER TABLE Table1 ENGINE = InnoDB ;

これには、テーブル全体の再構築が必要です。基本的に、新しい InnoDB テーブルを作成し、MyISAM テーブルからすべてのデータをコピーする必要があります。だから、それが使用されている間、大きなテーブルでこれをしないでください...

于 2012-08-09T15:29:20.540 に答える