Q&A
前提
下記のテーブルがあります。
SQL
1CREATE TABLE users ( 2 user_id INTEGER PRIMARY KEY, --ユーザーID 3 user_name TEXT NOT NULL, --ユーザー名 4 last_updated_at TIMESTAMP WITHOUT TIME ZONE --ユーザー情報更新日時 5)
下記の情報が登録済みとします。
user_id | user_name | last_updated_at |
---|---|---|
1 | Tanaka | 2023-01-01 23:21:22 |
2 | Inoue | 2023-01-01 23:21:22 |
3 | Fujimura | 2023-01-01 23:21:22 |
4 | Gotou | 2023-01-01 23:21:22 |
ここに、ユーザー情報が記載された外部ファイル(CSVやTSV)を読み取って UPSERT していきます。
※C#でDapperを使ってUPSERTするので、C#のコードが含まれています。
C#
1与えられるCSVファイルの例: 2users.csv------------------------------- 31, Tanaka, 2024-01-22 22:22:22 42, Inoue, 2023-01-01 23:21:22 53, Fujimura, 2023-01-01 23:21:22 64, Gotou, 2023-01-01 23:21:22 75, Kono, 2023-01-01 23:21:22 8----------------------------------------- 9 10//connection は、NpgsqlConnection です。 11connection.QueryParameters.Add("UserID", userID); //userID は、CSVの1カラム目 12connection.QueryParameters.Add("UserName", userName); //userName は、CSVの2カラム目 13connection.QueryParameters.Add("LastUpdatedAt", lastUpdatedAt); //lastUpdatedAt は、CSVの3カラム目 14 15connection.Execute(@" 16INSERT INTO 17 users AS U (user_id, user_name, last_updated_at) 18ON CONFLICT ON CONSTRAINT 19 users_user_id_pkey 20DO UPDATE 21SET 22 usert_name = @UserName, 23 last_updated_at = @LastUpdatedAt 24WHERE 25 U.user_id = @UserID 26 AND 27 U.last_updated_at < @LastUpdatedAt -- 情報更新日が新しくなった場合のみUPDATE 28");
実現したいこと
上記のソースコードで、UPSERT 自体は出来るのですが、
UPDATEされたレコード(user_id = 1)と、INSERTされたレコード(user_id = 5)を得たいのです。
通常の SELECT であれば、Dapper の Query<T>を使えばいいだけなのですが、
UPSERT の場合、どうすればいいのか見当がつきません。
どうすればよいのでしょうか?
回答1件
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。