有条件地将多个数据行插入多个Postgres表中

时间:2018-03-21 19:14:18

标签: sql postgresql npgsql

我有多行数据。这只是一些组成的数据,以便做一个简单的例子。

  • 数据包含nameagelocation
  • 我想将数据插入两个表personslocations,其中locations的FK为persons
  • 如果已经有人使用该名称,或者年龄低于18岁,则不应插入任何内容。
  • 我需要使用COPY(在我的实际示例中,我使用的是NPQSQL for .NET,我认为这是插入大量数据的最快方式)。

所以我会在一个事务中执行以下操作(不是100%确定语法,而不是现在在我的计算机上):

-- Create a temp table 
DROP TABLE IF EXISTS tmp_x;
CREATE TEMPORARY TABLE tmp_x
(
    name TEXT,
    age INTEGER,
    location TEXT
);

-- Read the data into the temp table
COPY tmp_x (name, age) FROM STDIN (FORMAT BINARY);

-- Conditionally insert the data into persons
WITH insertedPersons AS (
    INSERT INTO persons (name, age)
    SELECT name, age 
    FROM tmp_x tmp
    LEFT JOIN persons p ON p.name = tmp.name 
    WHERE 
        p IS NULL
        AND tmp.age >= 18
    RETURNING id, name
),

-- Use the generated ids to insert the relational data into locations
WITH insertedLocations AS (
    INSERT INTO locations (personid, location)
    SELECT ip.id, tmp.location 
    FROM tmp_x tmp
    INNER JOIN insertedPersons ip ON ip.name = tmp.name
),
DROP TABLE tmp_x;
  1. 有更好/更容易/更有效的方法吗?
  2. 是否有更好的方法来“链接”插入而不是INNER JOIN insertedPersons ip ON ip.name = tmp.name。如果name不是唯一的,该怎么办?我可以使用新的人ID更新tmp_x并使用它吗?

0 个答案:

没有答案