Изменить количество строк, затронутых обновлением - PullRequest
1 голос
/ 11 июля 2019

Я пытаюсь добиться здесь, чтобы в основном переопределить 0 строк. Обновляется , когда выдается UPDATE в случае, если фактическое значение PK / UK не существует в таблице. Вот что я сделал:

Фактическая таблица:

CREATE TABLE fdrgiit.vereine( 
team numeric(10) primary key, 
punkte int not null, 
serie int not null 
); 

Таблица пустышки:

CREATE TABLE fdrgiit.dummyup 
( 
id numeric(1) PRIMARY KEY, 
datetest timestamp 
); 

Вставленные записи в обе таблицы:

insert into vereine(team,punkte,serie) values(1, 50, 1); 
insert into vereine(team,punkte,serie) values(2, 30, 1); 
insert into vereine(team,punkte,serie) values(3, 25, 1); 
insert into vereine(team,punkte,serie) values(4, 37, 2); 
insert into dummyup values(1, now()); 

Создана следующая функция и триггер:

create or replace function updateover() 
returns trigger as 
$BODY$ 
begin 
if EXISTS (select 1 FROM vereine WHERE team = new.team ) then 
RETURN NEW; 
else 
UPDATE fdrgiit.dummyup set datetest=now() where id=1; 
RETURN NULL; 
end if; 
end; 
$BODY$ 
LANGUAGE plpgsql; 

create trigger update_redundancy 
before update on vereine 
for each row 
execute procedure updateover() ;

Но когда я выполняю ОБНОВЛЕНИЕ, подобное этому, я все равно получаю 0 строк, затронутых

update vereine set punkte=87 where team=5; 

Пожалуйста, просмотрите и предложите, если это то, что можно сделать.

1 Ответ

1 голос
/ 12 июля 2019

Вы не можете инициировать что-либо с UPDATE, которое не влияет на строку, поскольку триггеры срабатывают только для затронутых строк.

Но вы можете заключить альтернативу UPDATE в функцию:

CREATE OR REPLACE FUNCTION updateover()
  RETURNS int AS
$func$
   UPDATE dummyup
   SET    datetest = now()
   WHERE  id = 1
   RETURNING 2;
$func$  LANGUAGE sql;

... и запустите ваше UPDATE вложенное так:

WITH upd AS (
   UPDATE vereine
   SET    punkte = 87
   WHERE  team = 5  -- does not exist!
   RETURNING 1
   )
SELECT 1 FROM upd
UNION ALL
SELECT updateover()
LIMIT 1;

дБ <> скрипка здесь

Если ни одна строка не подходит для UPDATE, то 1-й внешний SELECT 1 FROM upd не возвращает строки и Postgres продолжает обрабатывать 2-й SELECT updateover(). Но если затронута хотя бы одна строка, заключительная SELECT никогда не выполняется. Именно то, что вы хотите.

Это обновляет dummyup один раз, если UPDATE на vereine не влияет ни на какие строки; никогда несколько раз. Но это нормально, поскольку now() равно STABLE на время транзакции.

Связанный:

...