Правила PostgreSQL и проблема nextval () / serial (очень специфичная для PostgreSQL)

Другой подход - создать отдельный рабочий стол и показать его. У него не будет значков.

Запуск приложения на отдельном рабочем столе

11
задан A.H. 4 October 2011 в 17:29
поделиться

2 ответа

Из документов http://www.postgresql.org/docs/8.4/static/rules.html

Он (система правил) изменяет запросы на учитывают правила, и затем передает измененный запрос планировщику запросов для планирования и выполнения

, чтобы он сначала перезаписывал запросы, ничего не выполняя.

вы можете заставить его работать, если не вставляете сразу несколько записей:

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

Затем вы можете сделать:

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

но не

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

Так что вам действительно не следует использовать систему правил с хитрыми вызовами currval ().

Также обратите внимание на комментарии на этих страницах:

Еще один совет: поддержка в списке рассылки postgresql так же превосходен, как и сам движок базы данных!

И между прочим: знаете ли вы, что postgresql имеет встроенную поддержку наследования?

Резюме: вам следует использовать триггеры или избегать вставки нескольких строк!

6
ответ дан 3 December 2019 в 11:21
поделиться

Правила сделают это за вас - они переписывают запрос перед его выполнением.

Пока у вас есть реальная таблица для базы (Children1), я думаю, вы сможете сделать то же самое с ТРИГГЕРОМ вместо ПРАВИЛА.

0
ответ дан 3 December 2019 в 11:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: