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)
归档时间: |
|
查看次数: |
5113 次 |
最近记录: |