Criar Insert Update PostgreSQL

Nesse post darei uma dica rápida de como criar um script de INSERT ou UPDATE a partir de um SELECT no postgresql.

Criando estrutura de exemplo

Criação da tabela País:

CREATE TABLE public.pais(
     id bigint NOT NULL,
     nome character varying(250) COLLATE pg_catalog."default" NOT NULL,
     codigo_area character varying COLLATE pg_catalog."default",
     CONSTRAINT pais_pkey PRIMARY KEY (id)
)
TABLESPACE pg_default;
ALTER TABLE public.pais OWNER to postgres;

Insert’s tabela País:

INSERT INTO pais(id, nome, codigo_area) VALUES (1, 'Irlanda', '+353');
INSERT INTO pais(id, nome, codigo_area) VALUES (2, 'Brasil', '+55');
INSERT INTO pais(id, nome, codigo_area) VALUES (3, 'Estados Unidos', '+1');
INSERT INTO pais(id, nome, codigo_area) VALUES (4, 'Inglaterra', '+44');

Criando a tabela Pessoa:

CREATE TABLE public.pessoa (
     nome character varying(250) COLLATE pg_catalog."default",
     id bigint NOT NULL,
     pais character varying(250) COLLATE pg_catalog."default",
     CONSTRAINT pessoa_pkey PRIMARY KEY (id)
)
TABLESPACE pg_default;
ALTER TABLE public.pessoa OWNER to postgres;

Insert’s tabela Pessoa:

INSERT INTO public.pessoa(id, nome, pais) VALUES (1, 'André', 'Estados Unidos');
INSERT INTO public.pessoa(id, nome, pais) VALUES (2, 'Eduardo', 'Inglaterra');
INSERT INTO public.pessoa(id, nome, pais) VALUES (3, 'Luiz', 'Irlanda');
INSERT INTO public.pessoa(id, nome, pais) VALUES (4, 'Tiano', 'Brasil');

Primeiro problema proposto

Vamos imaginar que nossa aplicação só possui a tabela pessoa, porém existe a necessidade de adicionar uma nova coluna na tabela pessoa informando o código de area do pais daquela pessoa.

Sendo assim, você busca na internet e encontra a uma lista de países com seus respectivos códigos de área.

Agora você tem um problema. Realizar um update na tabela pessoa adicionando a nova coluna e realizar um update adicionando o código de area referente ao país de cada pessoa. Logo iremos realizar um UPDATE através de um SELECT.

Vamos ao código.

Adicionando nova coluna na tabela pessoa

ALTER TABLE public.pessoa ADD COLUMN codigo_area character varying(250);

Agora precisamos fazer o update na tabela pessoa para popular essa nova coluna de acordo com a nossa tabela pais.

UPDATE pessoa
SET codigo_area = sub_pais.codigo_area
FROM (SELECT p.codigo_area, p.nome FROM pais AS p) AS sub_pais
WHERE pessoa.pais = sub_pais.nome;

Segundo problema proposto

Agora vamos imaginar que uma pessoa pode ter mais de um código de area, logo nossa primeira solução não atende mais nossa necessidade e uma das soluções seria criar uma tabela que vincular o id da pessoa e os código de area da pessoa.

Sendo assim vamos criar uma tabela que terá duas colunas, onde uma será o código da pessoa e a outra será o código da area. Posteriormente iremos fazer o insert dos dados e já temos para simular o INSERT a partir de um SELECT.

Criação da tabela:

CREATE TABLE public.pessoa_codigo_area (
     pessoa_id bigint NOT NULL,
     codigo_area character varying(250) COLLATE pg_catalog."default" NOT NULL,
     CONSTRAINT pessoa_codigo_area_pkey PRIMARY KEY (pessoa_id, codigo_area),
     CONSTRAINT fk_pessoa_id FOREIGN KEY (pessoa_id)
         REFERENCES public.pessoa (id) MATCH SIMPLE
         ON UPDATE NO ACTION
         ON DELETE NO ACTION
         NOT VALID
)
TABLESPACE pg_default;
ALTER TABLE public.pessoa_codigo_area OWNER to postgres;

Criando o script de INSERT através de um SELECT.

INSERT INTO pessoa_codigo_area(pessoa_id, codigo_area)
SELECT id, codigo_area FROM pessoa;

Conclusão

Criar script de INSERT e UPDATE a partir de um SELECT é relativamente simples, porém muito útil quando se faz alguma alteração na estrutura de tabelas do seu banco.

Quem precisa de mais detalhes pode deixar um comentário ou conferir a documentação oficial do PostgreSQL.

https://www.postgresql.org/docs/

Aproveitando para pedir uma atenção sua, criamos um canal no YouTube, se puder fortalecer o movimento dá um confere aí:

Deixe um comentário

O seu endereço de e-mail não será publicado.