一次更新两个ID SQL - PHP

时间:2010-12-20 16:35:30

标签: php sql

我有一张表,PK是一个int字段。 我的问题是我需要交换两个值。

这是我目前的代码:

$newId = (int)$id; $newId = $newId - 1;

$result = mysql_query("UPDATE homeScroller SET id = '$newId' WHERE id = '$id'") or die('error '.mysql_error()); 
$result2 = mysql_query("UPDATE homeScroller SET id = '$id ' WHERE id = '$newId'") or die('error '.mysql_error());

该表最多包含3行,其中包含网站首页上幻灯片的信息。首页按其ID排序。所以要改变我需要编辑ID的顺序。

4 个答案:

答案 0 :(得分:3)

  

该表最多包含3行,其中包含网站首页上幻灯片的信息。首页按其ID排序。所以要改变我需要编辑ID的顺序。

如果是这种情况,那么您的应用程序/数据库的架构很差,在进一步操作之前,您需要重新考虑数据库设计。

主键应该是不可变的,即:它们永远不会更改。你正在谈论的是改变主键。

修复您的应用程序/数据库,您将不会遇到此问题。您确定不应该仅添加新字段“sort_order”和ORDER BY sort_order,还是通过ID字段进行排序?

答案 1 :(得分:1)

分配一个临时id(0,因为auto_increment通常从1开始,所以0应该不使用):

$result = mysql_query("UPDATE homeScroller SET id = 0 WHERE id = '$id'");
$result = mysql_query("UPDATE homeScroller SET id = '$id ' WHERE id = '$newId'");
$result = mysql_query("UPDATE homeScroller SET id = '$newId ' WHERE id = 0");

重要提示:但是,如果您希望能够轻松更改订单,则不应依赖主键来订购结果。添加sequence列并按其排序。

答案 2 :(得分:1)

UPDATE  homeScroller
SET     id = CASE id WHEN $id THEN $newid ELSE $id END
WHERE   id IN ($id, $newid)

答案 3 :(得分:0)

请勿使用PK来满足此需求。

如果您可以在此表中添加时间戳字段(shown_at),请执行此操作! 如果不能,那么同时更新所有PK。只需增加它们。 例如:假设我们有这样的字符串:

  1 photo1
  3 myphoto
  5 somephoto

  than use modulo 3.
  1%3 = 1
  3%3 = 0
  5%3 = 2

  increment all records

  2 photo1
  4 myphoto
  5 somephoto

  2%3 = 2
  4%3 = 1
  6%3 = 0

所以你可以使用modulo和increment id