INSERT ... SELECTを使用して、ビューの特定の行の特定の列のデータをテーブルに挿入しています。ターゲットテーブルは次のとおりです。
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 は機能しますが、可能であれば次のように改善したいと思います。したがって、3 つの行が挿入された場合、最初の行が優先度 1、2 番目が 2、3 番目が 3 になります。
「1 から開始」ルールの例外: 指定された顧客のターゲット テーブルに既存の行がある場合、挿入された行をMAX(priority)+1
その顧客から開始したいと考えています。
サブクエリを使用できると思っていましたが、ここに問題があります。サブクエリが NULL を返す場合があり (queue
指定された顧客のテーブルにレコードがない場合)、priority
列が null を許可しないため、挿入が中断されます。
列を整数にキャストしようとしましたが、テーブルにその顧客 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`
1 つの SQL ステートメントでこれを行う方法はありますか、または少数の SQL ステートメント (行あたりの SQL ステートメントより少ない数) で行う方法はありますか?
この列は必ずしも一意ではなく、auto_increment 属性を使用して新しい行の一意の ID を生成するため、優先列を auto_increment に設定できるとは思いません。