SQLITE:提交后检查约束的事务

SQLITE:提交后检查约束的事务,sql,sqlite,transactions,constraints,Sql,Sqlite,Transactions,Constraints,我目前正在处理一个sqlite表,我必须执行以下操作: ID | Name | SortHint ---|-------|--------- 0 | A | 1 1 | B | 2 2 | C | 3 ID是主键,SortHint是带有唯一性-constant的列。我要做的是修改表,例如: ID | Name | SortHint ---|-------|--------- 0 | A | 3 1 | B |

我目前正在处理一个sqlite表,我必须执行以下操作:

ID | Name  | SortHint
---|-------|---------
 0 |   A   |    1
 1 |   B   |    2
 2 |   C   |    3
ID
是主键,
SortHint
是带有
唯一性
-constant的列。我要做的是修改表,例如:

ID | Name  | SortHint
---|-------|---------
 0 |   A   |    3
 1 |   B   |    1
 2 |   C   |    2
问题是:由于
的唯一性
我不能简单地更新一行又一行。我试过:

BEGIN TRANSACTION;
UPDATE MyTable SET SortHint = 3 WHERE ID= 0;
...
COMMIT;
但是第一次更新查询立即失败,原因是:

UNIQUE constraint failed: MyTable.SortHint Unable to fetch row
那么,有没有一种方法可以“禁用”事务的唯一约束,并且只在事务提交后检查所有约束

注意事项:

  • 我不能修改这个表
  • 如果我只使用表中不存在的
    SortHint
    值,它就可以工作
  • 我知道如何“解决”这个问题,但我想知道是否有如上所述的方法来解决这个问题

    • 一种可能是删除唯一约束,然后再次添加它。不过这有点贵

      另一种方法是将值设置为负值:

      UPDATE MyTable
          SET SortHInt = - SortHint;
      
      UPDATE MyTable
          SET SortHint = 3
          WHERE ID = 0;
      
      . . .
      

      如果无法修改表,则无法删除约束。 解决方法是将SortHint更改为未使用的范围。 例如,您可以将10000个项目添加到所有项目中。犯罪 然后立即换到现在免费的号码。 也许之后再测试,不存在10000或更高的数字

      可能重复的