Home > Net >  Liquibase insert select where not exists
Liquibase insert select where not exists

Time:04-28

I want to insert into table1 multiple rows from table2. The problem is that I have a field of same name in table2 and table1 and I don't want to insert data if there's already a record with same value in this field. Now I have something like this:

insert into table1 (id, sameField, constantField, superFied)
select gen_random_uuid(), "sameField", 'constant', "anotherField"
from table2;

And I assume I need to do something like this:

insert into table1 (id, sameField, constantField, superFied)
select gen_random_uuid(), "sameField", 'constant', "anotherField"
from table2
where not exists ... ? 

What I need to write instead of ? if I want this logic: check if there's already same value in sameField in table1 when selecting sameField from table2? DBMS is Postgres.

CodePudding user response:

You can use a sub-query to see whether the record exists. You will need to define the column(s) which should be unique.

create table table2(
id varchar(100),
sameField varchar(25),
constant varchar(25),
superField varchar(25)
);
insert into table2 values 
(gen_random_uuid(),'same1','constant1','super1'),
(gen_random_uuid(),'same2','constant2','super2')

2 rows affected

create table table1(
id varchar(100),
sameField varchar(25),
constant varchar(25),
superField varchar(25)
);
insert into table1 values
(gen_random_uuid(),'same1','constant1','super1');

1 rows affected

insert into table1 (id, sameField, constant, superField)
select uuid_in(md5(random()::text || clock_timestamp()::text)::cstring),
  t2.sameField, 'constant', t2.superField
from table2 t2
where sameField not in (select sameField from table1) 

1 rows affected

select * from table1;
select * from table2;
id                                   | samefield | constant  | superfield
:----------------------------------- | :-------- | :-------- | :---------
4cf10b1c-7a3f-4323-9a16-cce681fcd6d8 | same1     | constant1 | super1    
d8cf27a0-3f55-da50-c274-c4a76c697b84 | same2     | constant  | super2    

id                                   | samefield | constant  | superfield
:----------------------------------- | :-------- | :-------- | :---------
c8a83804-9f0b-4d97-8049-51c2c8c54665 | same1     | constant1 | super1    
3a9cf8b5-8488-4278-a06a-fd75fa74e206 | same2     | constant2 | super2    

db<>fiddle here

  • Related