2010-12-20 40 views
2

我有一个表是PK是一个int字段。 我的问题是我需要交换两个值的一轮。更新两个ID的一次SQL - PHP

这是我当前的代码:

$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

你可以像你需要换 – Woot4Moo 2010-12-20 16:37:39

+0

为什么你需要周围的交换他们什么更清楚了吗?这不是通常会在应用程序代码中发生的任务,而只会在数据库级别完成。 – HLGEM 2010-12-20 16:37:51

+0

你确定$ id也是一个int,对吧? ;) – DampeS8N 2010-12-20 16:39:11

回答

3

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

如果是这样的话,那么你的应用程序/数据库的架构设计很差,而且你需要在进一步考虑之前重新考虑你的数据库设计。

主键应该是不可变的,即:他们应该从来没有更改。你在谈论的是改变主键。

修复你的应用程序/数据库,你不会有这个问题。你确定你不应该只是添加一个新字段'sort_order'和ORDER BY sort_order来代替或者通过ID字段排序?

+0

事实上,考虑在'homeScroller'表中添加一个'position'列并更新它。 – prodigitalson 2010-12-20 16:49:09

+0

哦,这使得更多的意义! – Max 2010-12-20 16:49:16

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列,然后对其进行排序。

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

Fancy ... :)这是由所有/大多数SQL数据库引擎支持的东西吗? – netcoder 2010-12-20 16:49:27

+0

是的,所有主要的 – Quassnoi 2010-12-20 16:49:41

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 

所以u可以使用模,并增加IDS