我正在使用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。
不要在該使用AUTO_INCREMENT。儘管它的名字,這不是它的用途。此外,除非在交易中有約束力,否則您目前的解決方案將受到「競爭條件」的約束。 – Strawberry
當子查詢返回NULL時,你不能使用'IFNULL()'來處理這種情況嗎? – Barmar
@Strawberry,感謝您確認我對auto_increment的評論對這種情況沒有用處。你能否詳細說明你正在考慮的競賽狀況? – Josh