sql >> Database teknologi >  >> RDS >> PostgreSQL

PostgreSQL's regler og nextval()/serielt problem (meget PostgreSQL-specifikt)

Fra docshttp://www.postgresql.org/docs/8.4/ static/rules.html

så den omskriver først forespørgslerne uden at udføre noget.

du kan få det til at fungere, når du ikke indsætter flere poster på én gang:

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');
  );

Så kan du gøre:

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

men ikke

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

Så du bør virkelig ikke bruge regelsystemet med vanskelige currval()-kald.

Tag også et kig på kommentarerne på disse sider:

Et andet tip:supporten på postgresql-mailinglisten er lige så fremragende som selve databasemotoren!

Og forresten:ved du, at postgresql har understøttelse af nedarvning direkte fra boksen?

Resumé:du bør bruge triggere eller undgå indsættelse af flere rækker!



  1. MySQL-fejl::'Adgang nægtet for brugeren 'root'@'localhost'

  2. PostgreSQL Sqlalchemy commit tager meget tid

  3. Simpelt Ajax Jquery-script - Hvordan kan jeg få oplysninger om hver af rækkerne i tabellen?

  4. 2 måder at få det korte månedsnavn fra en dato i MariaDB