在mysql上进行唯一的主要Id交换?

时间:2011-03-16 16:56:02

标签: php mysql sql

我有一个sql表,其中包含php页面中菜单的数据。

 SELECT * FROM `hizlierisim` ORDER BY id LIMIT 0 , 10

按ID行排序。但我要求在管理面板上添加订单控制。 所以会有Up& Down Buttons来重新排列菜单项。

我想有两种方法可以做到这一点

一个是创建一个名为'order'的行并将sql查询更改为:

SELECT * FROM `hizlierisim` ORDER BY `order` LIMIT 0 , 10

交换我们想要移动的列的ID。 并且仍然使用相同的sql:

SELECT * FROM `hizlierisim` ORDER BY id LIMIT 0 , 10

id方法似乎更容易,但我想知道是否有可能在mysql上交换两列的id?

4 个答案:

答案 0 :(得分:5)

与主键字段混淆只是为了满足一些任意的排序要求是一个坏主意。特别是在外国关键的情况下。添加“订单”列(顺便说一句,这是一个保留字,所以如果你想节省一些其他的话,请使用别的东西)是实用的选择。

答案 1 :(得分:3)

更改此类功能的PK ID是一种非常糟糕的做法;更好地介绍一个排序列并使用它来排序。显然不要把它称为ORDER,因为这是一个保留的词......

答案 2 :(得分:3)

行的id应该是静态的,是记录的永久唯一标识符,这样它就可以作为外键存储在别处。

按照您的建议创建“order_id”会更好。这可以更改为您喜欢的任何值,没有副作用,它用于排序,更改它只影响排序。

就“交换”值而言,没有任何我知道的东西,你只需要自己编码。

要么...

BEGIN TRANSACTION

UPDATE x SET order_id = NULL WHERE order_id = 11
UPDATE x SET order_id = 11   WHERE order_id = 10
UPDATE x SET order_id = 10   WHERE order_id IS NULL

COMMIT TRANSACTION

(or similar)

或者类似......

UPDATE
  x
SET
  order_id = CASE order_id WHEN 11 then 10 ELSE 11 END
WHERE
  order_id IN (10,11)

答案 3 :(得分:2)

通过“交换”,我假设您正在谈论更新两列的主键值,这是可怕的,可怕的想法 - 我不能强调它有多糟糕,它可能带来什么影响。我建议你阅读一下主键是什么以及为什么你永远不应该使用它们。

添加另一个字段并使用值0,1等进行更新,并在该列上进行排序。您还可以在ORDER BY子句中指定多个列,这些列允许您按主键和其他一些列进行排序。