Php mysql上的唯一主Id交换?
我得到了一个sql表,其中包含php页面中菜单的数据Php mysql上的唯一主Id交换?,php,mysql,sql,Php,Mysql,Sql,我得到了一个sql表,其中包含php页面中菜单的数据 SELECT * FROM `hizlierisim` ORDER BY id LIMIT 0 , 10 它是按id行订购的。但我被要求在管理面板上添加订单控制。 因此,将有向上和向下按钮来重新排列菜单项 我想有两种方法可以做到这一点 一种是创建一个名为“order”的行,并将sql查询更改为: SELECT * FROM `hizlierisim` ORDER BY `order` LIMIT 0 , 10 或 要移动的列的excha
SELECT * FROM `hizlierisim` ORDER BY id LIMIT 0 , 10
它是按id行订购的。但我被要求在管理面板上添加订单控制。
因此,将有向上和向下按钮来重新排列菜单项
我想有两种方法可以做到这一点
一种是创建一个名为“order”的行,并将sql查询更改为:
SELECT * FROM `hizlierisim` ORDER BY `order` LIMIT 0 , 10
或
要移动的列的exchange id。
并且仍然使用相同的sql:
SELECT * FROM `hizlierisim` ORDER BY id LIMIT 0 , 10
id方法似乎更简单,但我想知道是否有可能在mysql上交换两列的id?仅仅为了满足一些任意的排序要求而弄乱主键字段是个坏主意。尤其是在外键的情况下。顺便说一句,添加一个保留字的“order”列,如果你想省掉一些麻烦,那么使用其他列是一个切实可行的选择。仅仅为了满足一些任意的排序要求而弄乱主键字段是一个坏主意。尤其是在外键的情况下。顺便说一句,添加一个保留字的“order”列,因此如果你想省掉一些麻烦,那么使用其他内容是一个切实可行的选择。更改此类功能的PK ID是一个非常糟糕的做法;最好引入一个排序列并使用它进行排序。显然,不要将其称为顺序,因为这是一个保留字…更改此类功能的PK ID是一种非常糟糕的做法;最好引入一个排序列并使用它进行排序。显然,不要将其称为顺序,因为这是一个保留字…行的id应该是静态的,是记录的永久唯一标识符,这样它就可以作为外键存储在其他位置 最好按照您的建议创建订单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)
行的id应该是静态的,是记录的永久唯一标识符,这样它就可以作为外键存储在别处 最好按照您的建议创建订单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)
通过exchange,我假设您谈论的是更新两列的主键值,这是一个非常可怕的想法——我无法强调它有多糟糕以及它可能有什么影响。我建议你读一些关于什么是主键以及为什么你不应该玩它们的书
添加另一个字段并使用值0、1等对其进行更新,并对该列进行排序。您还可以在ORDER BY子句中指定多个列,该子句允许您按主键和其他一些列进行排序。通过exchange,我假设您谈论的是更新两列的主键值,这是一个可怕的、可怕的想法-我无法强调它有多糟糕以及可能有什么影响。我建议你读一些关于什么是主键以及为什么你不应该玩它们的书
添加另一个字段并使用值0、1等对其进行更新,并对该列进行排序。您还可以在ORDER BY子句中指定多列,该子句允许您按主键和其他一些列进行排序。我不清楚您所说的exchange Id列是什么意思?我不清楚您所说的exchange Id列是什么意思?如果订单必须是唯一的且不为空,这是一种在不搜索暂时不使用的值的情况下进行交换的方法?@PhoneixS-使用单个update语句尝试第二个版本。如果失败了,那么你必须做一些事情来找到未使用的值。可能只是使用0或-1,或者您知道的值将永远不会被使用。感谢第二次运行Ok。我认为内部更新分两步进行是错误的,但mysql服务器就像一步。如果顺序必须唯一且不为null,那么这是一种不搜索暂时未使用的值的交换方式?@PhoneixS-使用单个UPDATE语句尝试第二个版本。如果失败了,那么你必须做一些事情来找到未使用的值。可能只是使用0或-1,或者您知道的值将永远不会被使用。感谢第二次运行Ok。我认为内部更新分两步进行是错误的,但mysql服务器就像一步。