2014-02-22 94 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'。 –