更新表,同时保留列的值

时间:2017-02-27 10:37:40

标签: php oracle csv

我有一个预定作业将解析以下CSV文件,如果服务器已在表中,则执行更新,如果没有,则插入。 (服务器名称是密钥)。

问题是CSV可能包含具有相同服务器但具有不同应用程序的行。在这些情况下,我必须进行更新,但保留应用程序的先前值。

如何在更新前保留以前的值?

server_name;ip_address;domain;application
s1;10.10.10.4;dom1;app1
s1;10.10.10.4;dom1;app2
s2;10.15.69.8;dom5;app10
s3;10.15.69.39;dom7;app5

我的代码就像($tab包含我在桌面上的内容)

while(($line = fgetcsv($lines))!== false){
   if (in_array($line[0],$tab)){ //update query}
   else { //insert query }
}

2 个答案:

答案 0 :(得分:0)

在临时停车表中导入csv rows值,然后对不在最终目标表中的行使用insert select

import statsmodels.formula.api as smf
lm = smf.ols(formula='Total_yield ~ Rain+ PH+EC', data=data).fit() 
lm.summary()

adn使用其他人的更新

insert into your_final_dest (server_name,ip_address,domain,application)
select server_name,ip_address,domain,application
from your_csv_parking 
where server_name not  in ( select server_name from your_final_dest )

答案 1 :(得分:0)

你说这是预定的工作。因为这是一个重复的活动,所以建立一些基础设施是值得的:特别是一个外部表,为CSV文件提供SQL接口。

外部表非常简洁:它们是使用CREATE TABLE定义的,但我们指定了一个源文件(非常类似于SQL * Loader控制文件语法)而不是存储子句。然后我们可以查询CSV文件中的数据,而无需将其加载到临时表中。 Find out more

关于插入和更新的问题,您应该查看MERGE语句。它在单个语句中处理INSERT和UPDATE。请注意,您可以使用外部表驱动MERGE:

merge into your_table
    using ( select * from external_table ) ext
    on ( your_table.server_name = ext.server_name )
when not matched 
     then insert values ( ext.server_name, ....)
when matched 
     then update set your_table.ip_address = ext.ip_address ....

我们可以将条件过滤器应用于INSERT和UPDATE子句。 Find out more