sql >> Databasteknik >  >> RDS >> PostgreSQL

PostgreSQL:s regler och nextval()/serieproblem (mycket PostgreSQL-specifikt)

Från dokumentethttp://www.postgresql.org/docs/8.4/ static/rules.html

så det skriver först om frågorna utan att köra något.

du kan få det att fungera när du inte infogar flera poster samtidigt:

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

Sedan kan du göra:

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

men inte

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

Så du borde verkligen inte använda regelsystemet med knepiga currval()-anrop.

Ta även en titt på kommentarerna på dessa sidor:

Ett annat tips:stödet på postgresql-sändlistan är lika utmärkt som själva databasmotorn!

Och förresten:vet du att postgresql har stöd för nedärvning direkt?

Sammanfattning:du bör använda triggers eller undvika att infoga flera rader!



  1. MySQL - Effektiv sökning med partiell ordmatchning och relevanspoäng (FULLTEXT)

  2. SqlAlchemy:få id för den senaste posten infogat

  3. mysql-fel:sub-query returnerar mer än 1 rad

  4. Betydelsen av transaktionslogg i SQL Server