2009-10-28 50 views
7

我想一些類似的東西:MySQL的:使用該行的ID被插入插入語句本身

INSERT INTO dir_pictures SET filename=CONCAT(picture_id,'-test'); 

picture_id是我的主鍵,自動遞增。基本上我試圖把這個插入語句的ID,在聲明本身。

我確定它可以用一些額外的PHP代碼或使用多個語句來完成,但我想知道是否有一種快速簡便的方法可以一次完成。

PS。上述說明始終將'0測試'

回答

10

先插入記錄。然後用分號分隔您的語句,並使用LAST_INSERT_ID()來獲取新插入的自動增量ID。一次執行。

 
insert into dir_pictures .... ; 
update dir_pictures set filename=CONCAT(LAST_INSERT_ID(),'-test') where id = LAST_INSERT_ID() 
+0

這可能會導致競爭條件...小心 – 2009-10-28 23:31:23

+7

它怎麼可能? last_insert_id()應該是連接特定的。引用手冊:'從多個客戶端同時使用LAST_INSERT_ID()和AUTO_INCREMENT列是完全有效的。每個客戶端都會收到客戶端執行的最後一條語句的最後一個插入ID。 – ChristopheD 2009-10-28 23:33:07

+1

夠公平的。我的錯誤 – 2009-10-28 23:34:48

0

那麼,你直到插入完成後才知道行ID ......所以,我認爲這不會奏效!

爲什麼不只是在檢索行時計算文件名呢?

INSERT INTO dir_pictures (file_extension) VALUES ('-data') 

SELECT picture_id, CONCAT(picture_id, file_extension) as filename 
FROM dir_pictures 
0

這是不是真的有可能,它很可能是您的最佳利益簡單地concatinate它的出路,而不是在路上。

SELECT CONCAT(ID,「-text」 )作爲文件名FROM dir_pictures

0

如果你真的想這樣做,在一個SQL語句,你可以嘗試像一個黑客:

INSERT INTO dir_pictures SET filename=CONCAT((select max(picture_id)+1 from dir_pictures),'-test');

當心的競爭條件,如果這是一個多線程應用程序...

而且,我懷疑它會在空表上工作...

+0

我想如果之前已經刪除了一行,這將不會準確 – 2009-10-30 17:12:38

+0

是的,謝謝,很好。如果_most recent_ added行被刪除,則會失敗。 – violoncello 2009-10-30 18:53:37

3

只要選擇了當前的AUTO_INCREMENT值表形式information_schema作爲您的插入的一部分:

INSERT INTO dir_pictures SET filename=CONCAT((SELECT auto_increment FROM 
information_schema.tables WHERE table_name='dir_pictures'), '-test') 
+0

是的,這將是在一個聲明中這樣做的方式......但它確實不是一個好主意。我肯定會做一個插入,然後更新。 – Eli 2009-10-29 03:00:04

+0

這是醜陋的,內部選擇完成和插入運行之間有一個小的競爭條件。 – Eli 2009-10-29 03:03:10