2010-12-20 93 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