Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php mysql上的唯一主Id交换?_Php_Mysql_Sql - Fatal编程技术网

Php mysql上的唯一主Id交换?

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

我得到了一个sql表,其中包含php页面中菜单的数据

 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服务器就像一步。