2011-08-12 96 views
0

我想要做的是運行一個php腳本,它選擇某些mysql條目,並將它們移動到表的頂部(或者就像插入時自動遞增id列一樣)。更新ID而不是選擇,刪除和插入?

說明:我有一個有100個條目的表格。條目n。 49和條目88必須如下更新:條目49被刪除,所有數據仍然被插入/插入到表格中,但是具有101的標識。

對於條目88:具有ID列的行值爲88的數據被刪除/更新,則更新的新條目/相同條目出現,其ID爲102,但數據相同。

此外,在腳本運行後,不會出現重複ID等問題,因此需要一個適用於MySQL的解決方案。

你明白了嗎?

我的問題是:這怎麼能做到最有效和最簡單的方式?

我心目中唯一的選擇是很長的,似乎過於複雜:選擇整行,將其刪除,插入新行的所有數據,並讓ID自動遞增本身......

現在如果有人願意與我分享他們對這件事的想法,我將非常感激!

其他信息:腳本將每天運行一次,功能強大的Apache專用服務器。沒有優化需要,問題簡單的解決方案要求一個簡單的方法來處理我的問題,而不需要這麼努力工作。


謝謝大家的幫助!我感謝你的每一個答案和評論!由於我認爲這個問題不能比我上面提到的更簡單地解決,所以使用一塊PHP,現在我正在討論這個問題。我再說一遍,感謝大家的回答!如果您對使用php的問題有一個解決方案,請在這裏回答,我會閱讀它,或者至少也許我們會幫助任何其他將來閱讀此主題的人,假設2012年不會帶來世界的盡頭......在這種情況下,沒有人會再讀這個帖子,你可能不會發布......但我想認爲未來是我們的決定:P ...再次感謝所有人!乾杯!

+10

不要以這種方式使用ID。創建另一列並使用放棄和歡樂來更新該列。 – Marvo

+3

更新ID? **永遠不會**改變身份證! – TMS

+4

@Marvo。不能同意更多。 Ids僅用於引用和外鍵等。不要修改它們進行分類,也不要回收它們。 – GolezTrol

回答

1

我遇到了一篇文章解釋A Point In Time database design。該文章描述使用triggers來實現設計。您可以使用此解決方案創建一個觸發器,而不是刪除,更新ID。

如前所述,混淆ID-s會非常危險,並且肯定會遲早損壞您的數據。

1

我真的不知道爲什麼你需要它,但是這將是我認爲最好的查詢:

UPDATE %table% SET id = (SELECT Auto_increment FROM information_schema.tables WHERE table_schema = DATABASE() && table_name = '%table%') WHERE id = %id%

如果你想確保DB將不會搞砸,使用事務(InnoDB的)或LOCK(MyISAM的)

InnoDB的

START TRANSACTION; 
UPDATE %table% SET id = (SELECT Auto_increment FROM information_schema.tables 

WHERE TABLE_SCHEMA = DATABASE()& & table_name ='%table%')WHERE id =%id%; COMMIT;

的MyISAM

LOCK TABLES %table% WRITE; 
UPDATE %table% SET id = (SELECT Auto_increment FROM information_schema.tables 

WHERE TABLE_SCHEMA = DATABASE()& &表名= '%表%')其中ID =%ID%; 解鎖表;

+0

您發佈的最後一個片段,它是否就像插入一個新的行,這意味着MySQL的內部'incrementor'會知道最後使用的id是101而不是100 , 像以前一樣?另外,請您簡單介紹一下表格鎖定時發生的情況。它不能寫入或讀取?感謝您的回答,並提前感謝您的下一個評論,告訴我所有這些。乾杯! –

+0

你好,這是完整的解決方案。這非常簡單 - 事務/鎖定阻止的OTHER線程在執行事務/鎖定查詢時更新表。這意味着不會有表腐敗的可能性 - 因爲沒有人可以寫信給你。是的,這很簡單。現在它是如何工作的 - 簡單的更新語句'UPDATE ***** SET id = xx WHERE id = yy',其中xx是select查詢,它從mysql獲取表*****的實際(下一個)自動增量值內部表(像這樣的查詢是用每個插入 - 內部完成的) – grongor

+0

用戶能夠在鎖定時間內讀取表中的數據嗎? (這完全是好奇心,因爲查詢會花費不足以打擾任何人)。而且,通過使用查詢,mysql確實會注意到自動增量ID的新值,對吧?非常感謝您的回答,我希望這可以解決它很不錯!乾杯! –

2

你知道有一個UPDATE類型的查詢吧?

警告!純潔的邪惡!

UPDATE `table` 
SET `field1`='value1', `field2` = 'value2', `id`=LAST_INSERTED_ID()+1 
WHERE `id` = 49; 

爲什麼純淨的邪惡警告?你千萬EVEREVEREVER改變現有條目的ID,因爲它勢必會弄亂你的表。最後的代碼是純理論,不推薦使用。

Manual Reference

+0

哦,加油!當然,我剛剛說過!你是否讀過我的問題開始? –

+1

當然我有。你的問題不是100%清楚。請詳細說明並澄清您的問題。 –

+0

好的,所以:我有一個記錄被插入到數據庫中,其ID爲55的100。現在我希望它成爲記錄101,但不是重新插入它(沒有重複的數據),更像是告訴mysql這個記錄是它必須插入的新記錄,讓mysql自動增加id字段本身。這更清楚嗎?無論如何,感謝您的回答。 :) –