2012-02-27 90 views
1

當添加一條記錄時,希望列的值與主鍵相同 - 而不是必須立即更新記錄已被添加,有沒有更好的方法來做到這一點?當在MySQL中添加一列時,有一列等於[自動增量]主鍵

目前我在做什麼:

$db->query("INSERT INTO 'mytable' SET ..."); 
$db->query("UPDATE 'mytable' SET someColumn=".$db->insert_id." WHERE id=".$db->insert_id); 

我想要做的只是運行一個查詢,而不是兩個對於這一點,如果這是可能的。

我目前做錯了什麼?不完全是,我只是想要這樣做,因爲學習編碼的新方法總是很好的。 :)

+2

你能解釋爲什麼你想要數據被複制嗎?你已經擁有數據庫中的數據,我不明白你爲什麼需要它兩次。 – SenorAmor 2012-02-27 21:05:35

+0

我想不出任何原因,你會使用它不會導致問題的地方。 – Crashspeeder 2012-02-27 21:08:24

+0

我使用它(重複列)作爲輸入後的數據排序目的。如果你知道一個更好的方式,沒有什麼麻煩,我願意提供建議。 – 2012-02-27 21:11:01

回答

1

INSERT INTO ... SET?這是錯誤的。 < - 不,這沒有錯,我是個傻瓜。

如果可能,我會創建CASCADE foreing key constraint。

+0

上週我第一次看到'INSERT INTO ... SET'。這似乎是完全有效的。 – Crashspeeder 2012-02-27 21:07:12

+0

是的,我現在看到了,但對我來說還是很奇怪。 :) – 2012-02-27 21:08:23

+0

我可以試試這個,儘管如果它甚至可能會顯得有些雜亂。與此同時,我正在瀏覽MySQL文檔。 – 2012-02-27 21:16:50

2

如果someColumn總是將等於id,這是無用的非規範化。在查詢中,應該簡單地使用id而不是someColumn

在正確的RDBMS中,或者如果您在應用程序端生成主鍵,則可以使用密鑰生成器來填充具有相同值的idsomeColumn列。不過,我不知道MySQL的AUTO_INCREMENT hack是否提供了類似線程安全的SQL序列。在任何情況下,您應該閱讀具體的documentation pages,因爲沒有任何標準知識或經驗可以幫助您解決特殊問題。

或者,您可以爲someColumn(或布爾列)指定一個特殊值,意思是「剛插入/使用id的值」。

+0

密鑰生成器聽起來不太糟糕,我會牢記這一點。謝謝。 – 2012-02-27 21:19:22

+0

也看起來像我可以在我的查詢中使用「someColumn = LAST_INSERT_ID()+ 1」,這不應該是可怕的。任何人都反對使用這個? – 2012-02-27 21:29:55

+1

它不會被同步。只有兩個併發插入會破壞它。 – aib 2012-02-27 21:47:46

1

如果你只需要它的順序,而不一定完全相同一樣的ID列,你可以這樣做:

INSERT INTO mytable SET foo = (select max(foo) + 1 from mytable) 

順便說一句,這看起來危險的對我說:

$db->query("UPDATE 'mytable' SET someColumn=".$db->insert_id." WHERE id=".$db->insert_id); 

假設您使用的是pdo,請始終使用預準備語句/綁定參數將值綁定到查詢 - 絕不能插入字符串。例如。;

$stmt = $db->prepare("UPDATE 'mytable' SET someColumn = :someColumn WHERE id = :id"); 
$stmt->execute(array(":someColumn" => $db->insert_id, ":id" => $db->insert_id)); 
相關問題