キーカラムに 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件のコメント
記事コメントは受け付けていません。