3
我的表格有一列名爲status
的數據類型爲CHARACTER
。我希望做到以下幾點。在sqlite3中切換值
如果主鍵不存在一行,請在
status
中插入'active'。如果某行已經有主鍵的條目,請撥status
。用於切換的值爲ative
,not_active
。
目前我正在通過編寫多個查詢。是否有任何單一的查詢來做這個像Mysql?
我的表格有一列名爲status
的數據類型爲CHARACTER
。我希望做到以下幾點。在sqlite3中切換值
如果主鍵不存在一行,請在
status
中插入'active'。如果某行已經有主鍵的條目,請撥status
。用於切換的值爲ative
,not_active
。
目前我正在通過編寫多個查詢。是否有任何單一的查詢來做這個像Mysql?
SQLite沒有像IF
這樣的控制邏輯命令,因爲這在嵌入式數據庫中沒有意義。
實現您使用的是訪問數據庫的任何一種語言的控制邏輯:
db.begin_transaction()
result = db.execute("SELECT status FROM MyTable WHERE id = ?", [id]);
if result.length > 0:
new_status = if result[0][0] == 'active': 'not_active' else: 'active'
db.execute("UPDATE MyTable SET status = ? WHERE id = ?", [new_status, id])
else:
db.execute("INSERT INTO MyTable(id, status) VALUES(?, ?)", [id, 'active'])
db.commit()
然而,切換邏輯本身可以用CASE
expression來實現,所以如果你沒有太在意清晰,你可以執行以下兩條命令,而不是在這個順序(UPDATE
會做什麼,如果記錄不存在,而INSERT OR IGNORE
會做什麼,如果新的記錄將違反唯一約束):
UPDATE MyTable
SET status = CASE status
WHEN 'active' THEN 'not_active'
ELSE 'active'
END
WHERE id = ?;
INSERT OR IGNORE INTO MyTable (id, status) VALUES (?, 'active');