Ако добавите булева актуализирана колона към хора
таблица:
ALTER TABLE хора ДОБАВЯНЕ НА КОЛОНА актуализиран bool DEFAULT FALSE;
тогава можете да идентифицирате актуализирани редове, като зададете updated =TRUE
в НАБОРА ЗА АКТУАЛИЗИРАНЕ
клауза:
INSERT INTO people (SELECT * FROM people_update) ON CONFLICT (име,фамилия) DO UPDATE SET age =EXCLUDED.age, street =EXCLUDED.street, city =EXCLUDED.city, postal =EXCLUDED.postal, актуализиран =TRUE WHERE (people.age,people.street,people.city,people.postal) Е РАЗЛИЧЕН ОТ (EXCLUDED.age,EXCLUDED.street,EXCLUDED.city,EXCLUDED.postal)RETURNING *;
Например,
CREATE TABLE test.people ( name text , text float , age float , street text , city text , postal int);CREATE UNIQUE INDEX people_idx on people (име, фамилия);ALTER TABLE people ADD COLUMN актуализиран bool;ALTER TABLE хора ADD COLUMN prior_age float;ALTER TABLE хора ADD COLUMN prior_street text;ALTER TABLE хора ADD COLUMN prior_city текст;ALTER TABLE хора ADD COLUMN prior_postal int;INSERT INTO хора (име, фамилия, възраст, улица, град, пощенски адрес) VALUES („Санчо“, „Панца“, 414, „1 Манчего“, „Барселона“, 01605), („Оливър“, „Туист“, 182, „2 Стилтън“, „Лондон“, 01837), („Квази“ , 'Modo', 188, $$3 Rue d'Arcole$$, 'Париж' , 01831 );CREATE TABLE test.people_update ( текст на име , текст на фамилия , възраст float , текст на улица , текст на град , пощенски int);INSERT INTO people_update (име, фамилия, възраст, улица, град, поща) СТОЙНОСТИ („Санчо“, „Панца“, 4140, „10 Idiazabal“, „Монсерат“, 16050), („Квази“, „Модо“, 1880, $ $30 Champs Elysée$$ , 'Париж', 18310 ), ('Pinocchio', 'Geppetto', 1380, '40 Nerbone', 'Florence', 18810);INSERT INTO хора (SELECT * FROM people_update) ON CONFLICT (име,фамилия) DO UPDATE SET updated =TRUE, prior_age =(CASE WHEN people.age =EXCLUDED.age THEN NULL ELSE people.age END) , prior_street =(CASE WHEN people.street =EXCLUDED.street THEN NULL ELSE people.street END) , prior_city =(CASE WHEN people.city =EXCLUDED.city THEN NULL ELSE people.city END) , prior_postal =(CASE WHEN people.postal =EXCLUDED.postal THEN NULL ELSE people.postal END) , age =EXCLUDED.age , street =EXCLUDED.street , city =EXCLUDED.city , postal =EXCLUDED.postal WHERE (people.age,people.street,people.city,people.postal) Е РАЗЛИЧЕН ОТ (EXCLUDED.age,EXCLUDED.street,EXCLUDED.city,EXCLUDED.postal)RETURNING *;
добиви
<предварителен код>| име | фамилия | възраст | улица | град | пощенски | актуализиран | предишна_възраст | prior_street | prior_city | prior_postal ||------------+----------+------+---------------- --+------------+--------+---------+----------+--- -------------+------------+--------------|| Санчо | Панса | 4140 | 10 Idiazabal | Монсерат | 16050 | t | 414 | 1 Манчего | Барселона | 1605 || Квази | Модо | 1880 | 30 Шанз Елизе | Париж | 18310 | t | 188 | 3 Rue d'Arcole | | 1831 || Пинокио | Джепето | 1380 | 40 Nerbone | Флоренция | 18810 | е | | | | |
Актуализиран
колона показва ('Sancho', 'Panza')
и ('Quasi', 'Modo')
редовете са актуализирани и('Pinocchio', 'Geppetto')
е ново вмъкване.