LINUX.ORG.RU

История изменений

Исправление 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