Если ваш вариант базы данных и версия поддерживает MERGE, вы можете использовать это (MERGE был добавлен в SQL Server 2005). Синтаксис немного неуклюжий, потому что он действительно предназначен для загрузки данных, выбирая из другой таблицы.
В этом примере используется Oracle (потому что это то, что у меня есть).
SQL> merge into customer
2 using ( select 6 as id
3 , 'Ella' as forename
4 , 'Chip' as surname
5 , '1234 Telepath Drive' as address_1
6 , 'Milton Lumpky' as address_2
7 , 'ML1 4KJ' as postcode
8 , add_months (sysdate, -235) as date_of_birth
9 from dual ) t
10 on (t.id = customer.id )
11 when not matched then
12 insert (id, forename, surname, address_1, address_2, postcode, date_of_birth)
13 values (t.id, t.forename, t.surname, t.address_1, t.address_2, t.postcode, t.date_of_birth)
14 /
1 row merged.
SQL> commit;
Commit complete.
SQL>
Если мы снова запустим тот же запрос (ID - это первичный ключ), он не потерпит неудачу, он просто объединит одну строку ...
SQL> merge into customer
2 using ( select 6 as id
3 , 'Ella' as forename
4 , 'Chip' as surname
5 , '1234 Telepath Drive' as address_1
6 , 'Milton Lumpky' as address_2
7 , 'ML1 4KJ' as postcode
8 , add_months (sysdate, -235) as date_of_birth
9 from dual ) t
10 on (t.id = customer.id )
11 when not matched then
12 insert (id, forename, surname, address_1, address_2, postcode, date_of_birth)
13 values (t.id, t.forename, t.surname, t.address_1, t.address_2, t.postcode, t.date_of_birth)
14 /
0 rows merged.
SQL>
Сравните и сравните с лысой вставкой ...
SQL> insert into customer (id, forename, surname, address_1, address_2, postcode, date_of_birth)
2 values ( 6, 'Ella', 'Chip', '1234 Telepath Drive', 'Milton Lumpky', 'ML1 4KJ',add_months (sysdate, -235) )
3 /
insert into customer (id, forename, surname, address_1, address_2, postcode, date_of_birth)
*
ERROR at line 1:
ORA-00001: unique constraint (APC.CUS_PK) violated
SQL>