在oracle或equiv中启用重复密钥更新(定义密钥/列?)



我有下面的工作insert语句,其中我本质上是通过循环将列数据从上传的.csv文件映射到下面的VALUES变量中。。。

所有操作都很好,只是现在我只是想添加一个调整INSERTUPDATE-如果"app_id"第一个,则在上传的.csv中找到值,即找到重复-只需更新已识别的重复行。。

根据一些研究,ON DUPLICATE KEY UPDATE是一条路,但我不明白如何/在哪里定义密钥-您可以在下面看到,我再次尝试将ON DUPLICATE KEY UPDATE添加到带有变量的查询末尾,但我确信这不可能是正确的。

$sql = "INSERT INTO app.also_data (app_id, fac_ident, lg_name, basic_tp, catc_vd, address, assoc_city, latitude, longitude, assoc_cnty, assoc_st, time_zone, dd_reg, ato_sa, ato_td, fema_reg, ops_hrs, prim_ph, atc_level, tower_type, manager, sat_phone_num, td_mgr, to_dist, tod_mgr, stof_fac, ops_status, crt_rl, created_user, date)
VALUES ('${data[0]}', '${data[1]}', '${data[2]}', '${data[3]}', '${data[4]}', '${data[5]}', '${data[6]}', '${data[7]}', '${data[8]}', '${data[9]}', '${data[10]}', '${data[11]}', '${data[12]}', '${data[13]}', '${data[14]}', '${data[15]}', '${data[16]}', '${data[17]}', '${data[18]}', '${data[19]}', '${data[20]}', '${data[21]}', '${data[22]}', '${data[23]}', '${data[24]}', '${data[25]}', '${data[26]}', '${data[27]}', '${data[28]}', '${data[29]}') ON DUPLICATE KEY UPDATE ('${data[0]}', '${data[1]}', '${data[2]}', '${data[3]}', '${data[4]}', '${data[5]}', '${data[6]}', '${data[7]}', '${data[8]}', '${data[9]}', '${data[10]}', '${data[11]}', '${data[12]}', '${data[13]}', '${data[14]}', '${data[15]}', '${data[16]}', '${data[17]}', '${data[18]}', '${data[19]}', '${data[20]}', '${data[21]}', '${data[22]}', '${data[23]}', '${data[24]}', '${data[25]}', '${data[26]}', '${data[27]}', '${data[28]}', '${data[29]}')";

注意:上面的工作是很好的插入减去我下面的尝试添加:

... ON DUPLICATE KEY UPDATE ('${data[0]}', '${data[1]}', '${data[2]}', '${data[3]}', '${data[4]}', '${data[5]}', '${data[6]}', '${data[7]}', '${data[8]}', '${data[9]}', '${data[10]}', '${data[11]}', '${data[12]}', '${data[13]}', '${data[14]}', '${data[15]}', '${data[16]}', '${data[17]}', '${data[18]}', '${data[19]}', '${data[20]}', '${data[21]}', '${data[22]}', '${data[23]}', '${data[24]}', '${data[25]}', '${data[26]}', '${data[27]}', '${data[28]}', '${data[29]}')";

那么,如何在列app_id的基础上正确添加ON DUPLICATE KEY UPDATE呢?如果在insert中发现重复的app_id值,那么只添加update

ON DUPLICATE KEY在Oracle中不是一个东西。最接近的等价物是MERGE语法。下面是一个如何在您的用例中使用它的示例(为了可读性,我减少了列的数量(:

merge into app.also_data a
using (select ? app_id, ? fac_ident, ? lg_name, ? basic_tp from dual) p
on (a.app_id = p.app_id)
when matched then 
update set 
a.fac_ident = p.fac_ident, 
a.lg_name = p.lg_name, 
a.basic_tp = p.basic_tp
when not matched then 
insert(app_id, fac_ident, lg_name, basic_tp) 
values(p.app_id, p.fac_ident, p.lg_name, p.basic_tp)

最新更新