行の整合性の保持: 重複チェックを使用したデータのコピー
同一のスキーマを持つ 2 つのテーブル間でデータを複製し、データを保証するタスクに直面した場合誠実さが最も重要になります。重複を無視してあるテーブルから別のテーブルに行をコピーしようとすると、一般的な問題が 1 つ発生します。この課題に対処する解決策を詳しく見てみましょう。
当初、提案された解決策には、サブクエリで WHERE 句を使用して重複行をフィルタリングすることが含まれていました。
INSERT INTO destTable SELECT * FROM srcTable WHERE NOT EXISTS(SELECT * FROM destTable)
しかし、このアプローチは失敗します。何が重複を構成するかを定義する基準を組み込みます。この問題を修正するには、サブクエリ内に一致基準を指定する追加の WHERE 句が必要です。
WHERE NOT EXISTS(SELECT * FROM destTable WHERE (srcTable.Field1=destTable.Field1 and SrcTable.Field2=DestTable.Field2...etc.)
または、外部結合により、より簡潔な解決策が提供されます。
INSERT INTO destTable SELECT s.field1,s.field2,s.field3,... FROM srcTable s LEFT JOIN destTable d ON (d.Key1 = s.Key1 AND d.Key2 = s.Key2 AND...) WHERE d.Key1 IS NULL
これこのアプローチでは、指定された結合に基づいて、宛先テーブルに一致する行がない行をソース テーブルから識別して挿入します。
さらに、ソーステーブル自体内の潜在的な重複行に問題がある場合は、次のような個別のステートメントを使用できます。
INSERT INTO destTable SELECT Distinct field1,field2,field3,... FROM srcTable
最後に、特定のフィールド名をリストすることをお勧めします。 SELECT * を使用するのではなく、insert ステートメントを使用して、意図したフィールドのみが確実にコピーされるようにします。
以上が重複チェックを使用してテーブル間でデータをコピーするときに行の整合性を維持するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。