在SQLite UPDATE中模拟ORDER BY以处理唯一性约束
我在SQLite 3中有一个表:
sqlite> .schema CREATE TABLE table1 (id INTEGER PRIMARY KEY NOT NULL,title TEXT UNIQUE NOT NULL,priority INTEGER UNIQUE NOT NULL); 以下是一些示例数据,用于说明: sqlite> SELECT * FROM table1; id title priority ---------- ---------- ---------- 1 a 1 2 b 2 3 c 3 4 d 4 我希望将优先级> 1的所有小区的优先级加1.这是我的第一次尝试: sqlite> UPDATE table1 SET priority = priority + 1 WHERE priority > 1; Error: column priority is not unique 这失败,可能是因为更新未被排序,允许UPDATE尝试将优先级列中的一个单元格设置为现有单元格的值.所以,这是我的第二次尝试: sqlite> UPDATE table1 SET priority = priority + 1 WHERE priority > 1 ORDER BY priority DESC; Error: near "ORDER": syntax error 这也失败了,大概是因为我的SQLite 3的安装没有用SQLITE_ENABLE_UPDATE_DELETE_LIMIT选项编译. 因为我最终可能想在Android上使用我的SQL语句和SQLite,后者也是does not启用了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 这也失败了,大概是因为SQLite在提交事务之前检查了唯一性约束. 三次尝试失败,但我确信这是可能的.问题是:如何做;在其中,如何最好地做到这一点? 注:我宁愿不依赖任何未经检查的假设. 您是正确的,因为SQLite在每次更新行之后检查约束,而不是在语句结束或事务结束时检查约束.我看到这个问题的解决方法(SQLite没有正确实现UPDATE).假设优先级列没有任何负值,我们可以将它们(负值)用作临时值以避免UNIQUE约束错误: UPDATE table1 SET priority = - (priority + 1) WHERE priority > 1 ; UPDATE table1 SET priority = - priority WHERE priority < 0 ; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |