-
実際、データベース内のデータを削除する方法は複雑ではありません。まず、ここで紹介するのは、データが相互に制約を形成する可能性があるためです。無限ループに陥る。 実際、データベース内のデータを削除する方法は複雑ではありません。まず、ここで紹介するのは、データが相互に制約を形成する可能性があるためです。 2 番目に、ここでは Microsoft の非公式 sp_MSForEachTable ストアド プロシージャが使用されています。
おそらく多くの読者や友人はこのようなことを経験したことがあります。開発データベースに基づいて空のデータベースをクリーンアップしたいのですが、データベース構造の全体的な理解が不足しているため、テーブル内のレコードを削除するときに削除できません。外部キー制約がある場合があるため、一般的なデータベース構造はメイン テーブルとサブテーブルです。この場合、通常は最初にサブテーブルのレコードを削除し、次にメイン テーブルのレコードを削除する必要があります。
データ レコードの削除というと、delete ステートメントと truncate ステートメントがよく頭に浮かびますが、2 つ以上のテーブル間に制約がある場合、これら 2 つのステートメントは失敗する可能性があり、最も恐ろしいのはこれら 2 つのコマンドのみを操作できることです。一度に 1 つのテーブル。 SQL Server データベース内のすべてのレコードを本当に削除したい場合はどうすればよいでしょうか。次の 2 つのオプションがあります。
1. テーブルの数が少なくても制約が多い場合、この方法は非常に現実的ではありません。制約を検討するのに多くの時間とエネルギーを費やす必要があります。次に、どのテーブルを最初に削除するか、どのテーブルを次に削除するか、どのテーブルを最後に削除するかを調べます。
2. すべての制約を無効にし、すべてのデータを削除し、最後に制約を有効にします。この方法では、制約を検討するために時間とエネルギーを費やす必要がなく、このタスクを自動的に完了するための単純なストアド プロシージャを作成するだけで済みます。
これら 2 つのオプションから、2 番目のオプションが最も単純で効果的であることがわかります。では、2 番目のオプションを使用する場合、それをどのように実装すればよいでしょうか。
まず、すべてのテーブルをループするコードを記述する必要があります。ここでは、ストアド プロシージャ sp_MSForEachTable をお勧めします。Microsoft の公式ドキュメントにはこのストアド プロシージャの説明がなく、多くの開発者は聞いたことがないため、検索してください。インターネット上の解決策のほとんどは非常に複雑で、公式文書がないため、この保存プロセスは不安定であり、心理的に拒否する可能性があると考える人もいるかもしれませんが、そうではありません。完全なスクリプトを見てみましょう。
プロシージャの作成 sp_DeleteAllData
として
EXEC sp_MSForEachTable 'ALTER TABLE NOCHECK CONSTRAINT ALL ?
EXEC sp_MSForEachTable 'ALTER TABLE をすべて無効にする'
EXEC sp_MSForEachTable 'DELETE FROM ?'
EXEC sp_MSForEachTable 'ALTER CHECK CONSTRAINT ALL ?
EXEC sp_MSForEachTable 'ALTER TABLE を有効にする'
EXEC sp_MSFOREACHTABLE 'SELECT * FROM ?'
行く
このスクリプトは、sp_DeleteAllData という名前のストアド プロシージャを作成します。最初の 2 つのステートメントは、実際にすべてのデータを削除し、最後のステートメントは各テーブルのレコードを表示します。このステートメントは省略できます。すべてのテーブルがクリアされたかどうかを確認したいだけです。
このストアド プロシージャは、どのデータベースでも実行できますが、もちろん、生成されたデータベースでは実行できませんが、それを教えなかった私を責めないでください。とにかく、まずデータベースをバックアップし、バックアップ データベースを使用して復元してから、ストアド プロシージャを実行してください。 、はは、たとえそれが大規模なデータベースであっても、データベースが空になるまでに時間はかかりません。少し怖いです。