我有一个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?
答案 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子句中指定多个列,这些列允许您按主键和其他一些列进行排序。