我有一张表,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的顺序。
答案 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