PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как мога да получа редовете INSERTED и UPDATED за операция UPSERT в postgres

Ако добавите булева актуализирана колона към хора таблица:

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') е ново вмъкване.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Функция DATE ADD в PostgreSQL

  2. PostgreSQL - Празна таблица

  3. ST_DWithin приема параметър като градус, а не метри, защо?

  4. Как да архивирате разделена таблица в PostgresSQL 10

  5. Как мога да настроя пътя за приложението heroku postgresql?