sam*_*per 6 sql sqlite android-sqlite
我在SQLite 3中有一个表:
sqlite> .schema
CREATE TABLE table1 (id INTEGER PRIMARY KEY NOT NULL,
title TEXT UNIQUE NOT NULL,
priority INTEGER UNIQUE NOT NULL);
Run Code Online (Sandbox Code Playgroud)
以下是一些示例数据,用于说明:
sqlite> SELECT * FROM table1;
id title priority
---------- ---------- ----------
1 a 1
2 b 2
3 c 3
4 d 4
Run Code Online (Sandbox Code Playgroud)
我希望在priority所有细胞中添加1 priority > 1.这是我的第一次尝试:
sqlite> UPDATE table1 SET priority = priority + 1 WHERE priority > 1;
Error: column priority is not unique
Run Code Online (Sandbox Code Playgroud)
这失败了,大概是因为更新没有排序,允许UPDATE尝试将priority列中的一个单元格设置为现有单元格的值.所以,这是我的第二次尝试:
sqlite> UPDATE table1 SET priority = priority + 1 WHERE priority > 1
ORDER BY priority DESC;
Error: near "ORDER": syntax error
Run Code Online (Sandbox Code Playgroud)
这也失败了,大概是因为我没有使用SQLITE_ENABLE_UPDATE_DELETE_LIMIT选项编译SQLite 3的安装.
因为我最终可能想在Android上使用我的SQL语句和SQLite,而后者也没有启用SQLITE_ENABLE_UPDATE_DELETE_LIMIT,所以我最好找到另一种方法来实现我的目标,而不是在启用SQLITE_ENABLE_UPDATE_DELETE_LIMIT的情况下重新编译SQLite 3.那么,这是我的第三次尝试:
sqlite> BEGIN TRANSACTION;
UPDATE table1 SET priority = priority + 1 WHERE priority > 1;
END TRANSACTION;
Error: column priority is not unique
Run Code Online (Sandbox Code Playgroud)
这也失败了,大概是因为SQLite在提交事务之前检查了唯一性约束.
三次尝试失败,但我确信这是可能的.问题是:如何做 ; 在其中,如何最好地做到这一点?
NB我宁愿不依赖任何未经检查的假设.
ype*_*eᵀᴹ 11
您是正确的,因为SQLite在每次更新行之后检查约束,而不是在语句结束或事务结束时检查约束.
我看到这个问题的解决方法(SQLite没有UPDATE正确实现).假设priority列没有任何负值,我们可以将它们(负值)用作临时值以避免UNIQUE约束错误:
UPDATE table1 SET priority = - (priority + 1) WHERE priority > 1 ;
UPDATE table1 SET priority = - priority WHERE priority < 0 ;
Run Code Online (Sandbox Code Playgroud)