mysql重新排序具有唯一约束的行

时间:2013-03-01 17:15:22

标签: php mysql sql algorithm

我在解决这个问题时遇到了一些麻烦。也许我让它变得比需要的更复杂。我有一张这样的桌子:

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

用户可能会弄​​乱他们的东西,可能会发生他们将事物1更改为事物3,事物3更改为事物1.在我的情况下,并不是用户明确地更改了订单。相反,他们正在修改他们的东西,他们可能会改变插槽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,则会破坏唯一约束。

订单栏纯粹用于展示,以便制作按字母顺序排列的列表。所以我想我可以使用PHP来检查顺序并像这样解决问题,但这会引入与重要内容无关的代码。我想找到一个纯粹/主要是SQL的解决方案。

另外,沿着相同的路线,如果我要在表中插入一个新行,我希望订单值为3.是否有一种有效的方法在SQL中执行此操作,而不必先使用{{1 }}?

2 个答案:

答案 0 :(得分:0)

我的评论似乎已经引起了一些关注,所以我将其作为答案发布...为了避免您的问题,添加一个没有约束的新列,并将其用于用户所需的更新。

答案 1 :(得分:0)

为什么不更新订单而不是thingid?

UPDATE tbl
    SET order = 2
    WHERE thing_id=1;

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

顺便说一句,您将需要做一些额外的工作来保持订单中的唯一值。

如果你改变它并将唯一约束放在user_id, order上,那么更新thing_id是有意义的。