我目前正在尝试使用一个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-day
和3-day
的数据,并为租借金额添加相应的值(2
每增加一次插入一次)。
答案 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