2014-02-22 92 views
0

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

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对于每个后续插入增加一次)的租金金额。

+0

你们是不是要得到相同的'dvd_price_id'淡水河谷所有三个,或增加它为每一个? –

+0

每增加一个。 –

+0

并且'dvd_price_id'是表的主键? –

回答

3

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

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

现在,您不必担心dvd_price_idINSERT可言。要获得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

+0

@eggyal你是对的。我只需要检查MySQL文档,看它是否真的支持'CROSS JOIN',它确实将它等同于'INNER JOIN'。 –