sql >> Base de Datos >  >> RDS >> PostgreSQL

Reglas de PostgreSQL y nextval()/problema en serie (muy específico de PostgreSQL)

De los documentos http://www.postgresql.org/docs/8.4/ estático/reglas.html

por lo que primero reescribe las consultas sin ejecutar nada.

puede hacer que funcione cuando no inserta varios registros a la 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');
  );

Entonces puedes hacer:

insert into Children1 (attribute1, attribute2) values ('a1', 'a2');
insert into Children1 (attribute1, attribute2) values ('b1', 'b2');

pero no

insert into Children1 (attribute1, attribute2)
  values ('a1', 'a2'),
         ('b1', 'b2');

Así que realmente no deberías usar el sistema de reglas con llamadas complicadas a currval().

Además, eche un vistazo a los comentarios en estas páginas:

Otro consejo:¡el soporte en la lista de correo de postgresql es tan excelente como el propio motor de la base de datos!

Y por cierto:¿sabe que postgresql tiene soporte para herencia listo para usar?

Resumen:¡debe usar activadores o evitar inserciones de varias filas!