powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как правильно в RULE ON INSERT получить значение поля типа SERIAL?
3 сообщений из 3, страница 1 из 1
Как правильно в RULE ON INSERT получить значение поля типа SERIAL?
    #33488000
victor_kr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Описание проблемы:

Есть обобщающая таблица :

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
CREATE TABLE device_basic
(
  id int4 NOT NULL DEFAULT nextval('device_basic_id_seq'::regclass),
  device_type_id int4 NOT NULL,
  CONSTRAINT pk_device_basic PRIMARY KEY (device_type_id)
)
WITHOUT OIDS;

Есть таблица с конкретными данными:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
CREATE TABLE device_radio
(
  id int4 NOT NULL DEFAULT nextval('device_basic_id_seq'::regclass),
  num int4 NOT NULL,
  CONSTRAINT pk_device_radio PRIMARY KEY (id)
) 
WITHOUT OIDS;

Для таблицы device_radio определено правило ON INSERT:
Код: plaintext
1.
2.
3.
CREATE OR REPLACE RULE rule_device_radio_i AS
    ON INSERT TO device_radio DO  INSERT INTO device_basic (id, device_type_id) 
  VALUES (new.id,  1 );

В документации написано:

For ON INSERT rules, the original query (if not suppressed by INSTEAD) is done before any actions added by rules. This allows the actions to see the inserted row(s).

Т.е. если я правильно понимаю написанное, значение для поля device_radio.id сгенерированное при добавлении записи должно быть доступно в правиле и должно сохраниться в таблице device_basic. Но этого не происходит. Если в таблицу device_radio записывается значение id = 1, то в таблицу device_basic записывается значение id = 2 и так далее. Можно предположить, что в правиле значение new.id is null. Помогите пожалуйста разобраться с проблемой. Как в таблицу device_basic сохранить тоже значение id, что и в таблице device_radio?

Спасибо.
...
Рейтинг: 0 / 0
Как правильно в RULE ON INSERT получить значение поля типа SERIAL?
    #33489989
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кажется вы наступили на типовой грабель с неатомарностью руля.
Там где вы пишете new.id постгресс по новой лезет за "значением" - т.е. вызывает некствал(секвенса) (т.е. делает новый вызов, следующий за тем, который он вызвал при вставке дефолта в собственно табличку). Разрулить можно видимо функцией... надо посмотреть

Вам удобнее это написать либо:
1. в виде обычного триггера
2. более красиво для постгреса - юзать центральную табличку "звезды" как предка к своим детям (...INHERIT...). при этом ничего в нее вставлять не придется. но 2 минуса -
1. не поддерживается таковая фича другими субд-ами, и
2. придется кажется лезть в contrib за специфич. ф-ями для сквозных индексов или ключей по "всей грозди" наследничков.
...
Рейтинг: 0 / 0
Как правильно в RULE ON INSERT получить значение поля типа SERIAL?
    #33490125
victor_kr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за совет. Видимо самый лучший вариант сделать все в триггерах. Пользы от наследования таблиц практически никакой. Интересно было бы посмотреть на решения в которых эффективно применяется наследование.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как правильно в RULE ON INSERT получить значение поля типа SERIAL?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]