2011-12-30 31 views
0

我正在嘗試重複行在同一個表中。表A有沒有auto_increment(不幸)。重新評估每個INSERT的MySQL子查詢

INSERT INTO A (id, foreign_id, value) 
    SELECT (SELECT MAX(id)+1 FROM A), 2, value 
     FROM A WHERE foreign_id = 1; 

(SELECT MAX(id)+1 FROM A)計算一次,所以它總是會返回相同的ID。在第二行插入查詢將失敗(重複的主鍵)。

我想,第一:

INSERT INTO A (id, foreign_id, value) 
    SELECT MAX(id)+1, 2, value 
     FROM A WHERE foreign_id = 1; 

但是,MAX(id)+1考慮WHERE foreign_id = 1,所以沒有保證,我會得到一個未使用的ID。

我如何可以繼續之一:

  • 有重新計算每個INSERT
  • 或更一般的子查詢:複製給我的錶行有否auto_increment
+0

使用'max(id)+ 1'生成一個唯一的號碼在多用戶系統中肯定會失敗。您應該使用自動增量列來代替 – 2011-12-30 11:26:50

+0

我正確的是,您並未真正複製,您嘗試使用不同的ID創建單獨的記錄,並且使用的foreign_ID爲2,但與具有1的foreign_ID的記錄具有相同的值?所以如果你有以下2條記錄:{1,1,1} {3,1,2}你想要一個新的集合{4,2,1}和{5,2,2}?如果是這樣,你想要「複製」多少條記錄,他們是否必須按照現有的記錄順序?而不是{4,2,1}和{5,2,2}將{4,2,1}和{6,2,2}?工作? – xQbert 2011-12-30 11:30:54

+0

@a_horse_with_no_name是的我知道,這只是一個大腳本,沒有多用戶或任何東西。 – 2011-12-30 11:30:59

回答

2

你有沒有嘗試過使用變量?

SET @max=SELECT MAX(id); 
INSERT INTO A (id, foreign_id, value) 
    SELECT @max:[email protected]+1, 2, value 
     FROM A WHERE foreign_id = 1; 
+0

謝謝你做的伎倆,第一次使用變量。如果在接受答案之前有其他可能的解決方案,我會再給它一點時間。 – 2011-12-30 11:33:26

+0

無論如何你都歡迎 – gotofritz 2011-12-30 11:35:38

1

根據評論我相信這會工作。 訣竅是你不能像你發現的那樣使用+1(除非你使用變量),但是你可以使用現有的ID並將它添加到max中,每次都會給你一個唯一的ID。

INSERT INTO A (id, foreign_id, value) 
    SELECT (SELECT MAX(id) FROM A)+ID, 2, value 
     FROM A WHERE foreign_id = 1; 
+0

IMO:fritzfromLondon的答案是更好的,如果你想保持序列無間距。礦井將保留與現有記錄相似的間距(因爲存在間隙,並且由於某種原因,您希望維護它們) – xQbert 2011-12-30 11:40:10

+0

有趣的是,這很簡單,即使我要小心達到列類型允許的最大數量。 – 2011-12-30 12:18:51