使用CASE的Mysql INSERT INTO SELECT语句

时间:2014-02-22 00:08:55

标签: mysql

我目前正在尝试使用一个INSERT语句将多行(三个)数据插入到我的数据库中?

INSERT INTO dvd_price
( SELECT
, (SELECT max(dvd_price_id) + 1 FROM dvd_price) --dvd_price_id
, d.dvd_id                                      --dvd_id
, 2                                             --rental amount
, '1-day'                                       --time rented for
FROM dvd d);

上面将为1-day插入一次;我想要使​​用相同的语句同时插入2-day3-day的数据,并为租借金额添加相应的值(2每增加一次插入一次)。

1 个答案:

答案 0 :(得分:3)

首先,您应该 尝试通过调用MAX(dvd_price_id) + 1来检索下一个插入ID。这不会对竞争条件免疫,并且可能会导致问题,因为它不可靠。如果您已经在AUTO_INCREMENT上没有dvd_price_id,建议您添加一个并让RDBMS为您处理增量。

ALTER TABLE dvd_price MODIFY dvd_price_id INT NOT NULL PRIMARY KEY AUTO_INCREMENT;

现在,您无需担心dvd_price_id中的INSERT。要获取1-day, 2-day, 3-day的所有三个值,您可以通过加入这些静态值的列表来创建笛卡尔积。这将导致表中当前每行的每个值都为一个。

INSERT INTO dvd_price (dvd_id, rental_amount, time_rented_for)
  SELECT
    dvd_id,
    2 AS rental_amount,
    rental_period
  FROM
    dvd
    /* join a subquery which creates a list of 'N-day' strings using
       SELECT 'value' UNION SELECT 'value'.....
       With no ON clause, it will do this for every row in `dvd`
     */
    CROSS JOIN (
      SELECT '1-day' AS rental_period 
      UNION SELECT '2-day' AS rental_period
      UNION SELECT '3-day' AS rental_period
  ) rental_periods

首先仅使用查询的SELECT部分进行测试,而不使用INSERT

以下是其工作原理的演示:http://sqlfiddle.com/#!2/a0862/1