Mysql重新排序行与唯一约束


mysql reorder rows with unique constraint

我很难想出一个有效的方法来解决这个问题。也许我把它弄得太复杂了。我有一个这样的表:

thing_id | user_id | order
    1         1        0
    2         1        1
    3         1        2

用户可能会弄乱他们的东西,可能会把第一件事变成第三件事,把第三件事变成第一件事。在我的例子中,并不是用户显式地改变了顺序。相反,它们是在修改它们的存储库,它们可能把槽1中的东西变成槽3中的东西,反之亦然。因此,如果用户执行此操作,则表应该如下所示:

thing_id | user_id | order
    3         1       0
    2         1       1
    1         1       2

更复杂的是(thing_id, user_id)有一个唯一的约束,所以进行顺序更新并不完全有效。如果我尝试UPDATE tbl SET thing_id=3 WHERE thing_id=1,唯一约束就被打破了。

order列纯粹是为了显示,以便生成按字母顺序排列的列表。我想我可以用PHP来检查顺序之类的东西,但这里引入的代码与重要的东西无关。我想找到一个纯粹/主要是SQL的解决方案。

同样,如果我要向表中插入新行,我希望order值为3。在SQL中是否有一种有效的方法来做到这一点,而不必首先使用SELECT MAX(order) WHERE user_id=1 ?

我的评论似乎得到了一些牵引力,所以我把它作为一个答案发布…为了避免这个问题,可以添加一个不带约束的新列,并将其用于用户所需的更新。

你为什么不更新订单而更新东西呢?

UPDATE tbl
    SET order = 2
    WHERE thing_id=1;

每一行代表一个"物-用户"对。数据是您想要使用的排序。您不希望更改实体("thing-user")。您想要更改数据

顺便说一下,你必须做一些额外的工作来保持唯一值的顺序。

如果你改变了这一点,并把唯一约束user_id, order,那么更新thing_id是有意义的。