【问题标题】:If record exists INSERT from the next row (Sql)如果记录存在从下一行插入(Sql)
【发布时间】:2022-01-15 15:19:49
【问题描述】:

我已将.csv 文件导入我的数据库表中。

它有三列,例如

(numbers, first_name, last_name)

numbers 列的行数从 1 到 200。

现在,我想将一个新的 .csv 文件导入到同一个表中。我会每天做。每次行从 1 开始到某个数字。

新的.csv 文件的“数字”值从 1 开始到 500。

当我导入新的.csv 文件时,它需要从 201 继续。它不应该更新或删除旧行。反之亦然,它需要从 201 继续行。

我该怎么做?请帮帮我。

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    由于您不想使用 CSV 文件中提供的值,请将 numbers 定义为 identity 列:

    create table the_table
    (
      numbers integer not null generated always as identity,
      first_name text, 
      last_name text
    );
    

    那么当你导入 CSV 时,只导入 first_namelast_name。如何执行此操作取决于您用于导入文件的工具。不幸的是,内置的copy 命令或psql 的\copy 只能导入文件的某些列。您还可以将此应用于已包含数据的现有表。

    如果您不能只导入某些列,则可以创建一个将始终通过触发器使用的序列。这将有效地忽略为数字列提供的任何值:

    create sequence numbers_seq
         start with 201; --<< or whatever you need depend
    
    create table the_table
    (
      numbers integer not null,
      first_name text, 
      last_name text
    );
    
    create function set_number() 
      returns trigger
    as
    $$
    begin
      new.numbers := nextval('stuff.numbers_seq');
      return new;
    end;
    $$
    language plpgsql;
    
    create trigger populate_numbers_trigger
      before insert on the_table
      for each row 
      execute procedure set_number();
    

    在导入期间(实际上是任何 INSERT),无论在 INSERT 语句中指定了什么,值都将始终从序列中获取。这独立于任何工具工作。但是,触发器比identity 列稍慢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-04
      • 2016-01-13
      • 2011-07-01
      • 2021-09-03
      • 1970-01-01
      • 1970-01-01
      • 2022-06-10
      • 1970-01-01
      相关资源
      最近更新 更多