Como automatizar uma atualização em uma tabela, após uma alteração em outra tabela?
Diga (veja abaixo) eu tenho uma mesa countries
e uma mesa cities
. Como fazer com que, ao adicionar uma cidade na tabela cities
, a total
coluna seja atualizada automaticamente (incrementada para a cidade correspondente) na tabela countries
?
Tipo de :
BEGIN; INSERT INTO cities VALUES ('Tokyo', 'Japan'); UPDATE countries SET total=1 WHERE name='Japan'; COMMIT;
, mas automático, faça um countries.the_city.total++
ao adicionarcities.the_city
.
Países:
postgres=# SELECT * FROM countries;
name | total
-------+-------
USA | 0
Japan | 0
(2 rows)
Cidades:
postgres=# SELECT * FROM cities;
name | country
------+---------
(0 rows)
Comandos:
CREATE DATABASE geo;
\c geo;
CREATE TABLE countries (
name VARCHAR(15) PRIMARY KEY,
total int
);
CREATE TABLE cities (
name VARCHAR(15),
country VARCHAR(15),
FOREIGN KEY (country) REFERENCES countries(name)
);
Contexto:
SQL padrão ou Postgres v16
As informações redundantes são melhor mantidas com um gatilho.
Você deve primeiro certificar-se de que
total
possui um valor padrão razoável:Então, um gatilho para manter a contagem poderia ser assim:
Este é apenas um exemplo. Há espaço para melhorias: você pode, por exemplo, ignorar o processamento de atualizações que não modificam o nome do país. Você pode adicionar gatilhos adicionais para tornar a solução mais à prova de balas, como adicionar um gatilho que impeça a atualização,
total
a menos que a atualização tenha sido chamada por um gatilho.