关于 oracle 或 equiv 中的重复密钥更新(定义 key/column?)
ON DUPLICATE KEY UPDATE in oracle or equiv (defining key/column?)
我有下面的工作 insert
语句,我基本上是通过循环将上传的 .csv 文件中的列数据映射到我的 VALUES
下面的变量...
一切正常,除了现在我只是想添加一个调整 INSERT
或 UPDATE
- 如果 'app_id
' 第一个 column, 在上传的 .csv 中找到值,即 找到重复项 - 只需更新已识别的重复行..
根据一些研究 ON DUPLICATE KEY UPDATE
是可行的方法,但是 我不明白 how/where 我定义了密钥? - 你可以看到下面我尝试再次使用我的变量将 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)
我有下面的工作 insert
语句,我基本上是通过循环将上传的 .csv 文件中的列数据映射到我的 VALUES
下面的变量...
一切正常,除了现在我只是想添加一个调整 INSERT
或 UPDATE
- 如果 'app_id
' 第一个 column, 在上传的 .csv 中找到值,即 找到重复项 - 只需更新已识别的重复行..
根据一些研究 ON DUPLICATE KEY UPDATE
是可行的方法,但是 我不明白 how/where 我定义了密钥? - 你可以看到下面我尝试再次使用我的变量将 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)