sql >> Databáze >  >> RDS >> PostgreSQL

Pravidla PostgreSQL a nextval()/sériový problém (velmi specifické pro PostgreSQL)

Z dokumentůhttp://www.postgresql.org/docs/8.4/ static/rules.html

takže nejprve přepíše dotazy, aniž by cokoliv provedl.

můžete to zprovoznit, když nevkládáte více záznamů najednou:

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

Pak můžete udělat:

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

ale ne

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

Takže byste opravdu neměli používat systém pravidel se složitými voláními currval().

Podívejte se také na komentáře na těchto stránkách:

Další tip:podpora v mailing listu postgresql je stejně skvělá jako samotný databázový stroj!

A mimochodem:víte, že postgresql má podporu pro dědičnost hned po vybalení?

Shrnutí:měli byste používat spouštěče nebo se vyvarovat vkládání více řádků!



  1. Nelze se připojit k MySQL pomocí Sequelize

  2. Vytvořte propojený server mezi dvěma kontejnery Docker se systémem SQL Server (příklad T-SQL)

  3. Tipy pro migraci z HAProxy na ProxySQL

  4. Optimalizátor Oracle 10 z RULE na COST:proč?