1

データベースに5つのMyISAMテーブルがあるとします。各テーブルにはキーがあります。これを「id_num」と呼びましょう...

「id_num」は、すべてのテーブルを接続するために使用するフィールドです。「id_num」の特定の値は、すべてのテーブルに表示される場合と、テーブルのサブセットのみに表示される場合があります。

データベース内の特定の「id_num」のすべてのインスタンスを削除したい場合、すべてのテーブルでDELETEコマンドを実行できますか、それとも「id_num」の値が存在するかどうかを確認する必要がありますか?

DELETE * FROM table1 WHERE id_num = 123;
DELETE * FROM table2 WHERE id_num = 123;
DELETE * FROM table3 WHERE id_num = 123;
DELETE * FROM table4 WHERE id_num = 123;
DELETE * FROM table5 WHERE id_num = 123;

または、削除する前に、最初に各テーブルでSELECTコマンドを実行して、これらの行がテーブルに存在するかどうかを確認する必要がありますか?ベストプラクティスは何ですか?

(私はMyISAMを使用しているので、カスケード削除はここではオプションではありません。)

4

3 に答える 3

1

次のように設計を変更する必要があるようですid_num。PKとしてテーブルをid_num作成し、on-delete-cascadeを使用して他のテーブルにFKを作成します。これにより、1つのdeleteステートメントのみを実行して、該当するすべてのデータを削除できます(これは、通常、より正しい方法です)。

上記は明らかにMyISAMでは機能しませんが、トリガーを使用した回避策があります(ただし、今ではあまり魅力的なオプションではないようです)。

しかし、上記のクエリは機能するはずです。最初に何かが存在するかどうかを確認する必要はDELETEなく、何もしません。

rows affectedほとんどのAPIは、データが実際に削除されたかどうかを確認したい場合に、ある種のカウントを提供します。

于 2013-02-15T06:09:56.910 に答える
1

SELECTを最初に実行することについての質問に答えるには、そうすることに利点はありません。特定のテーブルに行がない場合、DELETEは単にゼロ行に影響します。一致する行がある場合は、最初にSELECTを実行してから、DELETEを実行すると、行を見つける作業が2倍になります。したがって、DELETEを実行して、それを乗り越えてください。

MySQLにマルチテーブルのDELETE構文があることをご存知ですか?

table1に一致する行があることが確実な場合は、他の行に外部結合を使用できます。

DELETE table1.*, table2.*, table3.*, table4.*, table5.*
FROM table1
LEFT OUTER JOIN table2 USING (id_num)
LEFT OUTER JOIN table3 USING (id_num)
LEFT OUTER JOIN table4 USING (id_num)
LEFT OUTER JOIN table5 USING (id_num)
WHERE table1.idnum = 123;

これらすべてのテーブルでid_numのインデックスが作成されていると想定しています。そうしないと、JOINのパフォーマンスが低下します。ただし、行を見つけるためにインデックスを使用せずにDELETEを実行すると、パフォーマンスも低下します。

于 2013-02-15T07:13:53.680 に答える
0

テーブルから削除する前にselectクエリを実行しないでください。selectクエリは、サーバーに余分な負荷をかけます。ただし、削除クエリを実行した後、phpのmysql_affected_rows()関数を使用して、削除された行数を確認できます。

于 2013-02-15T07:09:47.193 に答える