質問

別のテーブルにレコードを挿入しているテーブルがあります。 レコードを挿入済みとしてマークする最善の方法は何ですか?

役に立ちましたか?

解決

次のように2つのテーブルの違いを確認できます。

  

SELECT * FROM tableFoo
    LEFT JOIN tableBar ON tableFoo.commonColumn = tableBar.commonColumn
    WHERE tableBar.commonColumn IS NULL

両方のテーブルに一致する列があり、列がnullのときに結合されるレコードはtableBarにのみ存在するレコードであるという考え方です。

これが機能する理由は、逆結合を行う内部結合とは異なり、テーブルの1つにnull値がある場合でも、左結合がレコードを返すためです。

これらのレコードを取得したら、返されたIDに基づいて挿入できます。

他のヒント

他のテーブルにないレコードのみを挿入します。 NOT EXISTS 句を使用するか、結果からすべての not-NULL レコードを左結合してフィルタリングします

>

最良の方法は、共通キーを使用する(または最初のテーブルのキーを2番目のテーブルのキーの先頭部分にする)ことです。この方法では、表2に存在しないTABLE1から行を選択するだけです。

キーを何らかの方法で変換する必要がある場合の最適な代替方法は、TABLE1で挿入トリガーを使用することです。そこに行を挿入すると、トリガーが起動し、TABLE2にデータを挿入できます。これには、単一のトランザクションを使用する利点と欠点があります。データの一貫性を維持できるという利点があります。TABLE2がレポートやその他の重要でない目的で使用される場合の欠点です。

行が挿入されたことを示すフラグをTABLE1で使用することを決定しないでください。これは、テーブル内のデータをテーブルを使用するプロセスに結合しているため、論理的設計と物理的設計の両方から見にくいです。

頻繁に使用する方法は2つあります。テーブルの性質によっては、ある方法が別の方法よりも優れている場合がありますが、#2を使用する場合は、テーブル構造を改善する可能性があります。

1。)テーブルにインデックスが付けられ、適切な主キーがあることを確認します。主キーがtable2に存在しないtable1からすべてのレコードを選択します。これは、正規化されたテーブルで機能します

2。)テーブルが正規化されておらず、適切なキーがない場合は、ProcessedDateをtable1に追加できます。 nullのProcessDateを持つすべてのレコードを挿入し、ProcessDateを現在の日時に設定します。 table2に挿入している間、table1に新しいレコードが挿入されていないことを確認する必要があります。

テーブル構造がわからなければ、適切な答えを出すことは困難です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top