PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Reguły PostgreSQL i problem nextval()/serial (bardzo specyficzne dla PostgreSQL)

Z dokumentacjihttp://www.postgresql.org/docs/8.4/ static/rules.html

więc najpierw przepisuje zapytania bez wykonywania czegokolwiek.

możesz sprawić, że będzie działać, jeśli nie wstawisz wielu rekordów naraz:

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

Następnie możesz zrobić:

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

ale nie

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

Więc naprawdę nie powinieneś używać systemu reguł z trudnymi wywołaniami currval().

Dodatkowo spójrz na komentarze na tych stronach:

Kolejna wskazówka:obsługa listy mailingowej postgresql jest tak doskonała, jak sam silnik bazy danych!

A tak przy okazji:czy wiesz, że postgresql obsługuje dziedziczenie od razu po zainstalowaniu?

Podsumowanie:powinieneś używać wyzwalaczy lub unikać wstawiania wielu wierszy!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sortuj agregację tekstu utworzoną za pomocą array_agg w postgresql

  2. Python 3.7 psycopg2 - Błąd błędu Xcode:polecenie 'gcc' nie powiodło się ze statusem wyjścia 1

  3. Jak zastosować funkcję PostgreSQL UNLOGGED do istniejącej tabeli?

  4. Jak mogę dołączyć do tabeli pochodnej?

  5. Upuszczanie kolumny w Postgresie na dużym zbiorze danych