以前我有方法,這取決于我是否有版本,要么增加它,要么插入新列:
public void Increment(int id, long version)
{
if (version == 0)
{
_db.ExecuteNonQuery($@"
INSERT INTO table (id, version)
VALUES (:id, 0)
ON CONFLICT DO NOTHING;
", _db.CreateParameter("id", id));
}
var affectedRows = _db.ExecuteNonQuery($@"
UPDATE table
SET version = version 1
WHERE id = :id AND version = :preVersion;
",
_db.CreateParameter("id", id),
_db.CreateParameter("version", preVersion));
if (affectedRows != 1)
throw new Exception("None Updated");
}
現在我將不再將版本傳遞給我,所以我試圖使用 IF EXISTS 陳述句來確定我應該插入還是更新。但是,問題是我撰寫 sql 的方式不會回傳受影響的行數,我不知道如何更改它。目前它看起來像這樣:
public void Increment(int id)
{
var affectedRows = _db.ExecuteNonQuery($@"
DO
$do$
BEGIN
IF EXISTS (SELECT 1 FROM table WHERE id = {id}) THEN
UPDATE table
SET version = version 1, updated = '{DateTime.Now}'
WHERE id = {id} AND (updated IS NULL);
ELSE
INSERT INTO table (id, version, updated)
VALUES ({id}, 0, '{DateTime.Now}');
END IF;
END
$do$");
if (affectedRows != 1)
throw new Exception($"None updated");
}
uj5u.com熱心網友回復:
假設它id是主鍵或者它具有唯一約束,然后根據您的查詢使用您的第二個示例。它嘗試插入,如果因為id已經存在而失敗,則更新但僅當updated is null. 我想這正是你的邏輯,但用普通的 SQL 重新排序和改寫。
INSERT INTO the_table (id, version, updated) VALUES ({id}, 0, current_timestamp)
ON CONFLICT (id) DO UPDATE
SET version = version 1, updated = current_timestamp WHERE updated IS NULL;
我已經{DateTime.Now}用 SQL-standard代替了current_timestamp,希望有更好的可讀性。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/531196.html
標籤:C#PostgreSQLasp.net 核心.net-core
上一篇:在物體框架中,如何使用System.Data.Entity.EntityState.Modified修改存盤在另一個類中的物件串列?
