0

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

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 的解决方案。

同样,如果我要在表中插入一个新行,我希望 order 值为 3。在 SQL 中是否有一种有效的方法可以做到这一点,而无需先行SELECT MAX(order) WHERE user_id=1

4

2 回答 2

0

我的评论似乎得到了一些关注,因此我将其发布为答案...为避免您的问题,请添加一个没有约束的新列,并将其用于用户所需的更新。

于 2013-03-01T17:47:37.000 回答
0

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

UPDATE tbl
    SET order = 2
    WHERE thing_id=1;

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

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

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

于 2013-03-01T18:30:23.610 回答