Sqlite:如果没有使用引用则删除,否则更新

时间:2015-06-01 16:06:29

标签: sqlite case

我有useruser_id作为primary key

user_id | name   | email           | deleted
1       | John   | john@gmail.com  | NULL

在其他一些表格中使用字段user_id作为参考。

现在,当我想要删除用户时,我想delete该行如果未在其他某些表格中使用,或update(标记users.deleted=1)(如果使用)

在这一刻,我是从两个序列中完成的,但我想从一个序列中完成。

我尝试CASE但没有机会......说"近CASE语法错误"

CASE 
WHEN (SELECT count(resp_user_id) AS counter FROM equip WHERE user_id = 1)  > 0
  THEN (UPDATE users SET deleted = 1 WHERE user_id=1)
  ELSE (DELETE FROM users WHERE user_id=1) 
END

我写错了什么?

2 个答案:

答案 0 :(得分:0)

SQLite是一个嵌入式数据库,即它被设计为与“真正的”编程语言一起使用。

SQLite本身没有这样的逻辑。您必须在程序中编写逻辑,并使用多个SQL语句:

cursor = db.execute("SELECT resp_user_id AS counter FROM equip WHERE user_id = ?", [id])
if not cursor.empty:
    db.execute("UPDATE users SET deleted = 1 WHERE user_id = ?", [id])
else:
    db.execute("DELETE FROM users WHERE user_id = ?", [id])

要使访问成为原子,请将它们包装到事务中。

答案 1 :(得分:0)

不是一个序列,但是以安全的方式命令可以是:

begin transaction; 
delete from users where user_id=1 and ((select count(resp_user_id) from equip where resp_user_id = 1) = 0); 
update users set deleted = 1 where user_id=1 and ((select count(resp_user_id) from equip where resp_user_id = 1) > 0); 
end transaction;