2017-02-27 79 views
0

我有一個計劃作業,將解析以下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 } 
} 
+0

如果包括開始的文件和表格兩種數據,並表現出對所有三種情況下所期望的結果(新服務器名稱,現有服務器名+現有應用程序的名稱,現有服務器的名稱會更容易理解你的困境+新的應用程序名稱)。 – APC

回答

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

+0

感謝您的外部桌子提示。我可能在有空閒時儘快使用它。現在正處於急於創建一個特定的循環,我創建一個具有連接值的數組:'array([s1] => app1,app2 [s2] => app10 [s3] => app5)'然後運行我的更新。 – RidRoid

0

導入你在臨時停車表的CSV行值,然後使用插入在選擇的行不是你爲他人

UPDATE your_final_dest 
SET application = (SELECT application 
        FROM your_csv_parking 
        WHERE your_final_dest.server = your_csv_parking.server) 
WHERE EXISTS (SELECT your_csv_parking.application 
       FROM your_csv_parking 
       WHERE your_final_dest.server = your_csv_parking.server); 
最終目的地表

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) 

ADN使用更新