使用SQLLite交换主键值是否有最佳实践方法?

使用SQLLite交换主键值是否有最佳实践方法?,sql,sqlite,Sql,Sqlite,作为一个背景,我正在使用一个SQL Lite数据库,该数据库被一个封闭源代码UI使用,该UI不按方便的时间戳列对结果进行排序(哎呀,谢谢诺基亚!)——它只使用默认排序,对应于主键,这是一个普通的自动递增“id”列 我很容易得到当前和所需id值的映射,但应用映射是我当前的问题。似乎我无法交换这些值,因为更新一次只处理一行,这将暂时导致重复的值。我曾尝试使用update语句和case子句,使用临时的无序值,但由于每行只处理一次,这显然不起作用。因此,我需要3条update语句来交换一对值,这远远不够

作为一个背景,我正在使用一个SQL Lite数据库,该数据库被一个封闭源代码UI使用,该UI不按方便的时间戳列对结果进行排序(哎呀,谢谢诺基亚!)——它只使用默认排序,对应于主键,这是一个普通的自动递增“id”列

我很容易得到当前和所需id值的映射,但应用映射是我当前的问题。似乎我无法交换这些值,因为更新一次只处理一行,这将暂时导致重复的值。我曾尝试使用update语句和case子句,使用临时的无序值,但由于每行只处理一次,这显然不起作用。因此,我需要3条update语句来交换一对值,这远远不够理想,因为我希望它能够很好地扩展

更复杂的是,设置了许多触发器,这使得在新表中添加/删除行成为一个复杂的问题,除非我可以在由于表复制和删除而导致的任何添加/删除期间禁用这些触发器,这就是为什么我还没有采用这种方法的原因


我想我的下一步调查将是一个带有新ID的新列,然后在删除旧列之前找到将主索引移动到该列的方法,但我将把它扔到那里,以防有人能提供更好的解决方案,从而节省我一些时间:)

啊,好的。SQLLite只支持非常有限的ALTERTABLE子集,所以我不会更改主键。。。作为附录,我打算从外部来源向表中添加新记录。在最有可能的用例中,大多数旧记录都不需要更改,只需要在最后一个较大的卡盘左右与当前记录的结尾交错。对不起,我不理解您的目标。我知道你的UI是按INT PK排序的,我想你更喜欢用时间戳排序。但是,它在自动递增id上的排序到底是什么问题呢?我还不明白。问题是UI按时间顺序显示事件。这与正常使用一样好,它们只会按发生的顺序插入。问题在于我正在编写一个同步工具来导入事件。新记录可能在现有事件之前出现,因此为了正确显示新记录,需要调整生成的记录ID。如果UI有一个ORDERBY子句,那么就没有必要了,但是我可以理解为什么他们忽略了它。遗憾的是,我不能添加它,所以我必须调整ID以获得相同的效果。我们是在讨论Qt吗?能否将ORDER BY添加到sql语句中?或者您正在使用一个项目视图及其默认模型(例如,QTableWidget)?