我有一个包含单个表的数据库,我想用单个sqlite查询交换两行
我尝试过以下查询,但这不适用于sqlite
UPDATE
rules AS rule1
JOIN rules AS rule2 ON
( rule1.rule_id = 1 AND rule2.rule_id = 4 )
SET
rule1.priority = rule2.priority,
rule2.priority = rule1.priority
;
任何人都完成了这项任务,请帮帮我
答案 0 :(得分:1)
这样的查询在语法上是有效的,但是不可以工作,因为第一行在第二行更新之前会被更新:
UPDATE rules
SET priority = CASE rule_id
WHEN 1 THEN (SELECT priority FROM rules WHERE rule_id = 4)
WHEN 4 THEN (SELECT priority FROM rules WHERE rule_id = 1)
END
WHERE rule_id IN (1, 4)
如果您想要单个查询的原因是速度,那么只需对所有四个语句使用单个事务;这是你能得到的最快速度:
db.beginTransaction();
try {
long prio1 = DatabaseUtils.longForQuery(db,
"SELECT priority FROM rules WHERE rule_id = " + 1, null);
long prio4 = DatabaseUtils.longForQuery(db,
"SELECT priority FROM rules WHERE rule_id = " + 4, null);
db.execSQL("UPDATE rules SET priority = " + prio4 + " WHERE rule_id = " + 1);
db.execSQL("UPDATE rules SET priority = " + prio1 + " WHERE rule_id = " + 4);
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}