キーカラムにNULLを含む行は、既存レコードと一致しないと判定されます。そのため、 ジョブを実行するたびに同じ行が INSERT され重複が発生します。
NULL = NULL は一致 (TRUE) ではなく不一致として扱われます。
検証例
キーカラムを order_id + order_date の 2 列に設定し、キーが一致するレコードが存在した場合の挙動を「上書き」にした場合の例です。
① 転送前のデータマート
| order_id | order_date | amount |
|---|---|---|
| A001 | 2024-01-01 | 1000 |
| A002 | 2024-01-01 | 2000 |
| A003 | NULL | 3000 |
② ソースデータ (A001のamountを1000 → 9999に変更)
| order_id | order_date | amount |
|---|---|---|
| A001 | 2024-01-01 | 9999 |
| A002 | 2024-01-01 | 2000 |
| A003 | NULL | 3000 |
③ 転送後のデータマート
| order_id | order_date | amount | 結果 |
|---|---|---|---|
| A001 | 2024-01-01 | 9999 | 更新 (amount: 1000 → 9999) |
| A002 | 2024-01-01 | 2000 | 変化なし |
| A003 | NULL | 3000 | 既存レコード (①から残存) |
| A003 | NULL | 3000 | 重複 INSERT (②から追加) |
A001 はキーカラム ( order_id + order_date ) が既存レコードと一致したため、amountが正しく更新されました。一方 A003 は order_date が NULL のため既存レコードと一致しないと判定され、毎回 INSERT されて重複が発生しています。
対処法
キーカラムにはNULLを含まないカラムを指定することを推奨します。NULLが入り得るカラムをキーに使用する場合は、クエリにて COALESCE などを使って NULL を別の値に変換してください。
コメント
0件のコメント
記事コメントは受け付けていません。