PostgreSQL:结合删除和更新

时间:2017-07-13 11:40:39

标签: sql postgresql

问题:需要解析为postgres数据库的电子表格集。插入是向前的。但是如果电子表格中的数据发生变化会怎么样呢。

因此,python3脚本会读取电子表格,它是变量(sheet1)和原始时间序列(sheet2)的混合。电子表格是灵活的数据收集,这就是原因。

然而,我似乎偶然发现电子表格中的数据不断变化。我使用的是postgresql 9.6,我知道怎么做UPSERT。

其中一个表格如下: | id | key_to_other_table |参数|值|

当表格中的key_to_other_table和参数不存在时,UPSERT工作正常。

问题是当参数最初在电子表格中并上传到数据库时,但在电子表格中已更正,但仍在数据库中。

我需要进行某种删除,但我不想直接删除所有行,然后只需重新插入,因为我使用了ID ...

我现在要进行一次获取,获取链接到某个电子表格的行的所有id,对这些值进行upsert,然后获取id。

比较两个列表,然后删除不再需要的列表。 但这似乎是三个不同的数据库查询...... 有一种优雅的方法可以一步到位吗?

1 个答案:

答案 0 :(得分:0)

如果您使用某种"加载标识符"扩展表格。然后使用UPSERT填充,您可以删除表中没有您期望的负载标识符的任何记录。

一般流程:

  1. ThisLoadIdentifier:=当前时间戳
  2. 从电子表格中插入行,设置load_identifier = ThisLoadIdentifier
  3. 从表中删除load_identifier!= ThisLoadIdentifier
  4. 示例演练:

    初始设置

    扩展您的表格以添加load_id列类型的varchar

    ALTER TABLE myTable ADD load_id VARCHAR;

    | id | key_to_other_table | parameter | value | load_id |

    更新所有现有行以获得初始值。

    `UPDATE myTable SET load_id = 'Existing Records';`
    

    <强>载入

    1. 更改您的python脚本,以便在开始加载之前,它会提供一个唯一的load_id。像当前时间等等。

      this_load_id = time.ctime()

    2. 在您的插入/ upsert中使用新的load_id值填充this_load_id列。

    3. 负载完成后。您插入或更新的每一行都有load_id = this_load_idload_id没有此值的任何行都来自较旧的负载,并且不在此电子表格中。 然后,您可以通过简单的删除

      来摆脱它们

      delete from myTable where load_id != this_load_id

    4. 警告:您可能希望在生产中使用比时间/日期字符串更高效的内容。