0

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 に設定できるとは思いません。

4

2 に答える 2

0

Barmarがコメントで言及しているように、null を返すサブクエリを処理するために使用しIFNULLます。したがって:

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`
于 2013-10-29T10:50:47.407 に答える