在不存在PostgresQL的地方插入多行

Pau*_*aul 7 postgresql postgresql-9.2

我想生成一个单独的SQL查询来批量插入表中不存在的一系列行.我当前的设置为每个记录插入创建了一个新的查询,类似于PostgreSQL中的WHERE NOT EXISTS中详述的解决方案会产生语法错误,但我想将其移动到单个查询以优化性能,因为我当前的设置可能会生成数百个查询一次.现在我正在尝试类似我在下面添加的示例:

INSERT INTO users (first_name, last_name, uid) 
SELECT ( 'John', 'Doe', '3sldkjfksjd'), ( 'Jane', 'Doe', 'adslkejkdsjfds')
WHERE NOT EXISTS (
  SELECT * FROM users WHERE uid IN ('3sldkjfksjd', 'adslkejkdsjfds')
)
Run Code Online (Sandbox Code Playgroud)

Postgres返回以下错误:

PG::Error: ERROR:  INSERT has more target columns than expressions
Run Code Online (Sandbox Code Playgroud)

问题是PostgresQL似乎不想在使用SELECT时获取一系列值.相反,我可以使用VALUES进行插入,但我不能阻止使用WHERE NOT EXISTS生成重复项.

http://www.techonthenet.com/postgresql/insert.php表明在部分示例-使用子选择多个记录,应该是使用SELECT另一个参考表中插入,所以我不知道为什么我似乎无法传递一系列值来插入.我传递的值来自外部API,因此我需要生成要手动插入的值.

a_h*_*ame 24

select没有按照自己的想法去做.

PostgreSQL中最紧凑的版本是这样的:

with data(first_name, last_name, uid)  as (
   values
      ( 'John', 'Doe', '3sldkjfksjd'),
      ( 'Jane', 'Doe', 'adslkejkdsjfds')
) 
insert into users (first_name, last_name, uid) 
select d.first_name, d.last_name, d.uid
from data d
where not exists (select 1
                  from users u2
                  where u2.uid = d.uid);
Run Code Online (Sandbox Code Playgroud)

这几乎相当于:

insert into users (first_name, last_name, uid) 
select d.first_name, d.last_name, d.uid
from (
   select 'John' as first_name, 'Doe' as last_name, '3sldkjfksjd' as uid
   union all
   select 'Jane', 'Doe', 'adslkejkdsjfds'
) as d
where not exists (select 1
                  from users u2
                  where u2.uid = d.uid);
Run Code Online (Sandbox Code Playgroud)