簡體   English   中英

從CSV有條件地插入postgres DB

[英]Conditional insert into postgres DB from CSV

我想將CSV導入Postgres表中,但是我希望能夠根據表中的現有行即時確定列應為0還是1。

例如,我正在將聯系人添加到表中,並希望將其標記為主要聯系人(如果不存在主要聯系人),否則將其添加為次要聯系人:

現有行:

contact_id | branch_id | primary
-------------+-----------+--------
1          | 100       | 1
2          | 101       | 1
3          | 101       | 0

CSV數據,

contact_id | branch_id
-----------+-----------
4          | 100
5          | 101
6          | 102
7          | 103

所需的結果,

contact_id | branch_id | primary
-----------+-----------+--------
1          | 100       | 1
2          | 101       | 1
3          | 101       | 0
4          | 100       | 0
5          | 101       | 0
6          | 102       | 1
7          | 103       | 1

請注意,由於這些分支已經存在主要聯系人,因此將聯系人4和5添加為次要聯系人,而由於這些分支不存在主要聯系人,因此將6和7添加為主要聯系人。

postgres 9.2有可能嗎?

我將使用PL / pgSQL函數和一個臨時表在兩個階段中實現它。 基本上:

  1. 使用與CSV文件對應的列創建一個臨時表
  2. COPY FROM CSV文件COPY FROM到該臨時表中
  3. 根據從臨時表LEFT JOIN到最終表中現有行的SELECT插入到最終表中,因此可以確定primary行是否已存在
  4. 刪除臨時表

(順便說一句,這意味着您可以使用SECURITY DEFINER函數,該函數以root身份創建,但由特權較低的用戶以CSV文件名硬編碼運行,而不是以root身份運行整個導入。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM