2013-10-29 55 views
0

我正在使用INSERT ... SELECT將來自視圖中特定行的特定列的數據插入表中。這裏的目標表:如何使用INSERT ... SELECT以特定的列自動遞增,從1開始?

CREATE TABLE IF NOT EXISTS `queue` (
    `ID` int(11) NOT NULL AUTO_INCREMENT, 
    `customerId` int(11) NOT NULL, 
    `productId` int(11) NOT NULL, 
    `priority` int(11) NOT NULL, 
    PRIMARY KEY (`ID`), 
    KEY `customerId` (`customerId`), 
    KEY `productId` (`productId`), 
    KEY `priority` (`priority`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ; 

的INSERT ... SELECT SQL我的作品,但我想如果可能的話,以改善它,如下所示:我想插入的行中的優先級列從1開始,並且每個後續行將優先級值增加1.因此,如果插入三行,則第一行將是優先級1,第二和第三個。對於「從1開始」的例外,規則:如果目標表中存在指定客戶的現有行,我希望插入的行以該客戶的MAX(priority)+1開頭。

我以爲我可以使用子查詢,但這裏的問題:有時候子查詢返回NULL(當有在queue表中指定的客戶沒有記錄),打破了插入,因爲priority列不允許空值。

我試圖將CAST列轉換爲整數,但當表中沒有該客戶ID的記錄時,仍然返回NULL。

我在這個例子中硬編碼了客戶ID,但是在我的應用程序中自然是一個輸入參數。

INSERT INTO `queue` 
(
`customerId`, 
`productId`, 
`priority`, 
`status`, 
`orderId`) 
SELECT 
    123, -- This is the customer ID 
    `PRODUCT_NO`, 
    (SELECT (MAX(`priority`)+1) FROM `queue` WHERE `customerId` = 123), 
    'queued', 
    null 
FROM 
    `queue_eligible_products_view` 

有沒有辦法在一個SQL語句或少量SQL語句中執行此操作,即每行少於SQL語句?

我不認爲我可以將優先級列設置爲auto_increment,因爲此列不一定是唯一的,並且auto_increment屬性爲used to generate a unique identity for new rows

+0

不要在該使用AUTO_INCREMENT。儘管它的名字,這不是它的用途。此外,除非在交易中有約束力,否則您目前的解決方案將受到「競爭條件」的約束。 – Strawberry

+2

當子查詢返回NULL時,你不能使用'IFNULL()'來處理這種情況嗎? – Barmar

+0

@Strawberry,感謝您確認我對auto_increment的評論對這種情況沒有用處。你能否詳細說明你正在考慮的競賽狀況? – Josh

回答

0

由於Barmar在評論中提到:使用IFNULL來處理你的子查詢返回null。因此:

INSERT INTO `queue` 
(
`customerId`, 
`productId`, 
`priority`, 
`status`, 
`orderId`) 
SELECT 
    123, -- This is the customer ID 
    `PRODUCT_NO`, 
    IFNULL((SELECT (MAX(`priority`)+1) FROM `queue` WHERE `customerId` = 123),1), 
    'queued', 
    null 
FROM 
    `queue_eligible_products_view` 
0

這裏是如何做到的遞增:

INSERT INTO queue (customerId, productId, priority, status, orderId) 
SELECT 123, product_no, @priority := @priority + 1, 'queued', null 
FROM queue_eligible_products_view 
JOIN (SELECT @priority := IFNULL(MAX(priority), 0) 
     FROM queue 
     WHERE customerId = 123) var 
相關問題