PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Regras do PostgreSQL e problema nextval()/serial (muito específico do PostgreSQL)


Dos documentoshttp://www.postgresql.org/docs/8.4/ static/rules.html

então ele primeiro reescreve as consultas sem executar nada.

você pode fazê-lo funcionar quando não inserir vários registros de uma só vez:
create or replace rule ct_i_children1 as
  on insert to Children1
  do instead (
    insert into Parents(id, attribute1, type)
      values(nextval('parents_id_seq'), new.attribute1, 'Child1');
    insert into Partial_Children1(id, attribute2, type)
      values(currval('parents_id_seq'), new.attribute2, 'Child1');
  );

Então você pode fazer:
insert into Children1 (attribute1, attribute2) values ('a1', 'a2');
insert into Children1 (attribute1, attribute2) values ('b1', 'b2');

mas não
insert into Children1 (attribute1, attribute2)
  values ('a1', 'a2'),
         ('b1', 'b2');

Então você realmente não deve usar o sistema de regras com chamadas currval() complicadas.

Além disso, dê uma olhada nos comentários nestas páginas:

Outra dica:o suporte na lista de discussão postgresql é tão excelente quanto o próprio mecanismo de banco de dados!

E a propósito:você sabe que o postgresql tem suporte para herança pronto para uso?

Resumo:você deve usar gatilhos ou evitar inserções de várias linhas!