>
> Além do que o Euler já comentou, eu tenho mais duas recomendações.
>
> 1. Essa é bem grave, usar `select coalesce(max(id)+1),1) ...` é uma
> prática comum, mas pode ter consequências indesejáveis devido à problemas
> de concorrência. Interessante que comentei sobre isso esses dia no último
> PGDay Campinas [1]. Caso duas sessões tentem executar esse código ao mesmo
> tempo, ambas vão recuperar o mesmo ID, tentando assim inserir o mesmo
> valor. A solução nesse caso é simplesmente usar uma SEQUENCE, para isso
> basta definir a coluna ID como SERIAL ou BIGSERIAL e simplesmente não usar
> essa coluna no INSERT, deixando o PostgreSQL gerar o ID automaticamente (ou
> então use DEFAULT ou nextval explícito).
>
> 2. Essa não é um problema, é mais uma pequena otimização. Eu também não
> usaria LOOP, simplesmente faria INSERT ... SELECT.
>
> O resultado seria mais ou menos assim:
>
>     INSERT INTO tarefa_itens (
>         id_tarefaag, data_horafin, data_horaexec, executada
>     )
>     SELECT
>         NEW.id, null, g.dt, 'N'
>     FROM
>         generate_series(new.dtinicial::timestamp, new.dtfinal, '1 day')
> AS g(dt)
>     WHERE
>         EXTRACT(DOW FROM g.dt) NOT IN (0,6);
>
> Se quiser fazer o equivalente ao SERIAL na coluna que já existe, basta
> executar:
>
>     BEGIN;
>     CREATE SEQUENCE tarefa_itens_id_seq;
>     ALTER TABLE tarefa_itens ALTER id SET DEFAULT
> nextval('tarefa_itens_id_seq');
>     ALTER SEQUENCE tarefa_itens_id_seq OWNED BY tarefa_itens.id;
>     SELECT setval('tarefa_itens_id_seq', max(id)) FROM tarefa_itens;
>     COMMIT;
>
> [1] http://www.slideshare.net/matheus_de_oliveira/o-que-voc-
> acha-que-sabe-sobre-banco-de-dados
>
> Atenciosamente,
> --
> Matheus de Oliveira
>
>
>
Obrigado Mateus, farei os ajustes. Só mais uma dúvida, utilizando a
sequence mencionada acima ou o nextval explícito, nunca ocorrerá problemas
de concorrência?
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a