Postgresql删除与主键匹配的记录

Postgresql删除与主键匹配的记录,sql,database,postgresql,etl,Sql,Database,Postgresql,Etl,我们通过批处理从第三方数据提供商处获取数据。对于它们提供的模式,它们发出分隔的文本文件,指示要删除的记录,然后是要添加的记录的不同文本文件 我删除记录的计划是将要删除的记录加载到临时表中,然后通过内部联接删除记录。例如: -- main table CREATE TABLE main_table ( city VARCHAR(40) NOT NULL, state CHAR(2) NOT NULL, PRIMARY KEY (city, state)); -- removing r

我们通过批处理从第三方数据提供商处获取数据。对于它们提供的模式,它们发出分隔的文本文件,指示要删除的记录,然后是要添加的记录的不同文本文件

我删除记录的计划是将要删除的记录加载到临时表中,然后通过内部联接删除记录。例如:

-- main table
CREATE TABLE main_table (
  city VARCHAR(40) NOT NULL,
  state CHAR(2) NOT NULL,
  PRIMARY KEY (city, state));

-- removing records
CREATE TEMPORARY TABLE delete_table (
  city VARCHAR(40) NOT NULL,
  state CHAR(2) NOT NULL,
  PRIMARY KEY (city, state));

INSERT INTO main_table (city, state) VALUES
  ('Chicago', 'IL'),
  ('Seattle', 'WA'),
  ('New York', 'NY'),
  ('Springfield', 'IL'),
  ('Springfield', 'MA');

INSERT INTO delete_table (city, state) VALUES
  ('Chicago', 'IL'),
  ('New York', 'NY'),
  ('Springfield', 'MA');

-- Delete statement
DELETE FROM main_table t
  USING delete_table d
  WHERE t.city=d.city AND t.state=d.state;

在这种情况下,这是通常删除记录的最佳方式吗?记录删除的范围可以从几行到一百万行,具体取决于表、日期和一百个表。此外,任何具有复合主键的表都需要自定义where子句。有没有一种方法可以使用自然联接,或者使用列列表谓词?

查询似乎足够了,可能会产生与存在时类似的执行计划。从delete_表d中选择1,条件相同,但您的意思是:避免在实际查询中键入内容?是的。正如我所说,有100多个表具有不同的主键基数。我创建了一个简单的函数来基于主键号构建where子句条件,但我想看看这是否是不必要的。此外,除了一个微示例之外,我还没有尝试运行这个逻辑。我希望在冒险沿着错误的道路走得太远之前,先发现这是否是一条可靠的路线,因为似乎有很多种方法可以继续。查询似乎足够了,可能会产生类似的执行计划,如存在的地方,从delete_表d中选择1,条件相同,但您的目的是什么:避免键入实际的询问?是的。正如我所说,有100多个表具有不同的主键基数。我创建了一个简单的函数来基于主键号构建where子句条件,但我想看看这是否是不必要的。此外,除了一个微示例之外,我还没有尝试运行这个逻辑。我希望在冒险沿着错误的道路走得太远之前,发现这是否是一条坚实的道路,因为似乎有许多方法可以继续。