История изменений
Исправление Eshkin_kot, (текущая версия) :
where not exists (select * from roles)
not exists — это означает «нет ни одной строчки в результате выполнения подзапроса select * from roles»
Смешивания данных не будет?
нет не будет, можно в explain (analyze) посмотреть как он работает:
explain (analyze,verbose) insert into roles (name) select * from (values
('user'),
('security'),
('admin')
) _
where not exists (select * from roles);
InitPlan 1 (returns $0)
-> Seq Scan on roles roles_1 (cost=0.00..19.00 rows=900 width=0) (actual time=0.009..0.009 rows=0 loops=1)
он получил вывод select * from roles
и сохранил в $0
One-Time Filter: (NOT $0)
-> Values Scan on "*VALUES*" (cost=0.00..0.04 rows=3 width=32) (actual time=0.003..0.005 rows=3 loops=1)
дальше посмотрел что $0 пустой (NOT $0
= true) и вернул все 3 строки из VALUES (rows=3
) в INSERT
а это когда уже есть данные:
InitPlan 1 (returns $0)
-> Seq Scan on roles roles_1 (cost=0.00..19.00 rows=900 width=0) (actual time=0.010..0.010 rows=1 loops=1)
получил одну строчку, понял что exists уже выполняется и дальше не смотрел
One-Time Filter: (NOT $0)
-> Values Scan on "*VALUES*" (cost=0.00..0.04 rows=3 width=32) (never executed)
never executed
— не стал выполнять VALUES и соответствено INSERT
Исходная версия Eshkin_kot, :
where not exists (select * from roles)
not exists — это означает «нет ни одной строчки в результате выполнения подзапроса select * from roles»
Смешивания данных не будет?
нет не будет, можно в explain (analyze) посмотреть как он работает:
explain (analyze,verbose) insert into roles (name) select * from (values
('user'),
('security'),
('admin')
) _
where not exists (select * from roles);
InitPlan 1 (returns $0)
-> Seq Scan on roles roles_1 (cost=0.00..19.00 rows=900 width=0) (actual time=0.009..0.009 rows=0 loops=1)
он получил вывод select * from roles
и сохранил в $0
One-Time Filter: (NOT $0)
-> Values Scan on "*VALUES*" (cost=0.00..0.04 rows=3 width=32) (actual time=0.003..0.005 rows=3 loops=1)
дальше посмотрел что $0 пустой (NOT $0
= true) и вернул все 3 строки из VALUES (rows=3
)
а это когда уже есть данные:
InitPlan 1 (returns $0)
-> Seq Scan on roles roles_1 (cost=0.00..19.00 rows=900 width=0) (actual time=0.010..0.010 rows=1 loops=1)
получил одну строчку, понял что exists уже выполняется и дальше не смотрел
One-Time Filter: (NOT $0)
-> Values Scan on "*VALUES*" (cost=0.00..0.04 rows=3 width=32) (never executed)
never executed
— не стал выполнять VALUES и соответствено INSERT