一条insert语句批量插入多条记录
常见的insert语句,向数据库中,一条语句只能插入一条数据:
insert into persons
(id_p, lastname , firstName, city )
values(204,'haha' , 'deng' , 'shenzhen');
(如上,仅插入了一条记录)
怎样一次insert插入多条记录呢?
使用示例:
insert into persons
(id_p, lastname , firstName, city )
values
(200,'haha' , 'deng' , 'shenzhen'),
(201,'haha2' , 'deng' , 'GD'),
(202,'haha3' , 'deng' , 'Beijing');
这样就批量插入数据了, 遵循这样的语法,就可以批量插入数据了。
执行成功,截图:
据说,在程序开发中,一次插入多条数据,比逐次一条一条的插入数据,效率高很多
所以在程序开发的时候,使用此批量插入,也是比较不错的
此语句在MySQL 5, postgreSQL 9.3执行通过。
定义个结构体数组
type ty_parmeter is record
(
v_hezuotype number(1),
v_comefrom varchar2(50),
v_regchannel varchar2(50),
v_newchannel nvarchar2(30)
) ;
type ty_parmeter_table is table of ty_parmeter index by binary_integer;
parameter_arry ty_parmeter_table;
BEGIN
parameter_arry(1).F_CHANNEL:=N'财付通'; parameter_arry(1).F_TYPE:=1; parameter_arry(1).F_COME:='cft'; parameter_arry(1).F_REG:='cftwan';
parameter_arry(2).F_CHANNEL:=N'拍拍'; parameter_arry(2).F_TYPE:=1; parameter_arry(2).F_COME:='paipai'; parameter_arry(2).F_REG:='paipai';
parameter_arry(7).F_CHANNEL:=N'支付宝'; parameter_arry(7).F_TYPE:=2; parameter_arry(7).F_COME:='zfb'; parameter_arry(7).F_REG:='zfbwan';
parameter_arry(17).F_CHANNEL:=N'新浪'; parameter_arry(17).F_TYPE:=0; parameter_arry(17).F_COME:='%sina%';parameter_arry(17).F_REG:='NULL';
parameter_arry(18).F_CHANNEL:=N'搜狐'; parameter_arry(18).F_TYPE:=0; parameter_arry(18).F_COME:='%sohu%';parameter_arry(18).F_REG:='NULL';
parameter_arry(22).F_CHANNEL:=N'搜索引擎';parameter_arry(22).F_TYPE:=0; parameter_arry(22).F_COME:='SEO%'; parameter_arry(22).F_REG:='NULL';
parameter_arry(23).F_CHANNEL:=N'主站'; parameter_arry(23).F_TYPE:=0; parameter_arry(23).F_COME:='NULL'; parameter_arry(23).F_REG:='NULL';
for i in 1..14
LOOP
update t_gather_userinfo
set F_REG_CHANNEL=parameter_arry(i).f_channel,
F_UPDATEDATE=sysdate
where F_TYPE = parameter_arry(i).f_type
AND F_COME =parameter_arry(i).f_come
AND F_REG =parameter_arry(i).f_reg
and F_REG_CHANNEL is null;
v_rownum :=sql%rowcount;
COMMIT;
END LOOP;
for i in 15..22 loop
update t_gather_userinfo
set F_REG_CHANNEL=parameter_arry(i).f_channel,
F_UPDATEDATE=sysdate
where F_TYPE = parameter_arry(i).f_type
AND F_COME like parameter_arry(i).f_come
AND F_REG =parameter_arry(i).f_reg
and F_REG_CHANNEL is null;
v_rownum :=sql%rowcount;
COMMIT;
end loop;
update t_gather_userinfo
set F_REG_CHANNEL=parameter_arry(23).f_channel,
F_UPDATEDATE=sysdate
where F_REG_CHANNEL is null;
v_rownum :=sql%rowcount;
COMMIT;
这段代码 在8个CPU 32核 30G内存机器上跑 时间 1分钟,16分钟 26,28,30分钟
要迁到差劲2个CPU 8核的机器上 跑的后果是 分别为 114,116,115,146分钟 update 1万9千条数据
采用CASE WHEN写法 就全表扫描一次
UPDATE t_gather_userinfo
SET f_reg_new_channel =
CASE
WHEN f_type = 1 AND f_come = 'CFT' AND f_reg = 'cftwan'
THEN '财付通'
WHEN f_type = 1 AND f_come = 'PAIPAI' AND f_reg = 'paipai'
THEN '拍拍频道'
WHEN f_type = 2 AND f_come = 'ZFBReg' AND f_reg = 'zfbwan'
THEN '支付宝'
WHEN f_type = 0 AND f_come LIKE '%sina%'
THEN '新浪'
WHEN f_type = 0 AND f_come LIKE '%sohu%'
THEN '搜狐'
ELSE 'MAINWEB'
END,
f_updatedate = SYSDATE
WHERE f_reg_new_channel IS NULL;