powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / PostgreSQL Разделение таблиц - очень странное поведение
12 сообщений из 12, страница 1 из 1
PostgreSQL Разделение таблиц - очень странное поведение
    #34515701
MySQLCraft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Исследую возможности и невозможности PostgreSQL
Кто практически работал с наследованием и разделением таблиц, подскажите плиз, в чем тут прикол?

На пустой схеме делаю четко по документации так

CREATE SEQUENCE my.id_seq;
create table my.sc (id int8 PRIMARY KEY,dat integer);
create table my.sc_0_3 (check (id BETWEEN 1::bigint and 3::bigint)) INHERITS (my.sc);
create table my.sc_4_8 (check (id BETWEEN 4::bigint and 8::bigint)) INHERITS (my.sc);
create table my.sc_9_13 (check (id BETWEEN 9::bigint and 13::bigint)) INHERITS (my.sc);
create table my.sc_14_20(check (id BETWEEN 14::bigint and 20::bigint)) INHERITS (my.sc);

create rule sc_0_3_ins AS ON INSERT TO my.sc WHERE (NEW.id BETWEEN 1::bigint and 3::bigint) DO INSTEAD INSERT INTO my.sc_0_3 VALUES(NEW.id,NEW.dat);
create rule sc_4_8_ins AS ON INSERT TO my.sc WHERE (NEW.id BETWEEN 4::bigint and 8::bigint) DO INSTEAD INSERT INTO my.sc_4_8 VALUES(NEW.id,NEW.dat);
create rule sc_9_13_ins AS ON INSERT TO my.sc WHERE (NEW.id BETWEEN 9::bigint and 13::bigint) DO INSTEAD INSERT INTO my.sc_9_13 VALUES(NEW.id,NEW.dat);
create rule sc_14_20_ins AS ON INSERT TO my.sc WHERE (NEW.id BETWEEN 14::bigint and 20::bigint) DO INSTEAD INSERT INTO my.sc_14_20 VALUES(NEW.id,NEW.dat);

Потом адын раз так

insert into my.sc(id,dat) values(nextval('my.id_seq'),1);
select * from my.sc;

Получаю сразу две записи в таких разделах и с такими значениями
my.sc_4_8 ( 8 ,1)
my.sc_9_13 (11,1)

Несколько вариантов перепробовал, в том числе с SERIAL NOT NULL DEFAULT nextval('my.id_seq').
Со счетчиком всё в полном ажуре, инкремент = 1
Перед инсертом значение = 1 после = 11
Вообще бред полный...

1) Как его расколдовать?
2) Как обойтись без явного вызова nextval('my.id_seq')?

Интересно, что вот так
insert into my.sc(id,dat) values(1,1);
insert into my.sc(id,dat) values(2,1);
insert into my.sc(id,dat) values(3,1);
insert into my.sc(id,dat) values(4,1);
insert into my.sc(id,dat) values(5,1);
insert into my.sc(id,dat) values(6,1);
insert into my.sc(id,dat) values(7,1);
insert into my.sc(id,dat) values(8,1);
insert into my.sc(id,dat) values(9,1);
insert into my.sc(id,dat) values(10,1);
insert into my.sc(id,dat) values(11,1);
insert into my.sc(id,dat) values(12,1);
insert into my.sc(id,dat) values(13,1);
insert into my.sc(id,dat) values(14,1);
insert into my.sc(id,dat) values(15,1);
insert into my.sc(id,dat) values(16,1);
insert into my.sc(id,dat) values(17,1);

и так
select nextval('my.id_seq');

всё работает правильно...
а вместе никак!
...
Рейтинг: 0 / 0
PostgreSQL Разделение таблиц - очень странное поведение
    #34516239
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
поведение стандартно для РУЛЕ постгреса. Любое упоминание NEW.id (и в условии и в исполняемой строке) приводит к вычислению переданной в INSERT (UPDATE) ф-ии.

выходы :
1. (искуственный) перед вставкой вызвать nextval, в самой вставке - всегда и только curval (вызов не приводит к смене значения)
2. вместо руле юзать ХП (вернее в _безусловном_ руле вызвать ХП, которая _внутри_себя_ уже поделит по таблицам. У ХП таких болезней "неатомарности" нет)
3. (бесполезный) высказаться по поводу ... прелестей ... и их ... разработчиков в "баги" (там уже и без вас на эту тему есть возмущения, можете ссылки найти тут поиском)
...
Рейтинг: 0 / 0
PostgreSQL Разделение таблиц - очень странное поведение
    #34516255
СергейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MySQLCraft
Несколько вариантов перепробовал, в том числе с SERIAL NOT NULL DEFAULT nextval('my.id_seq').
Со счетчиком всё в полном ажуре, инкремент = 1
Перед инсертом значение = 1 после = 11
Вообще бред полный...


Delo v tom chto RULE fakticheski rabotaet kak preprocessor, poetomu pri vstavke nextval(..) vse NEW.id v CHECK() proverkah budut zameneny na nextval(), i poetomu pri kajdom vychislenii CHECK uslovia schetchik budet uvelichivatsia... Eto i privodit k takim strannym znacheniam schetchika i strannym vstavlennym znacheniam
...
Рейтинг: 0 / 0
PostgreSQL Разделение таблиц - очень странное поведение
    #34516313
MySQLCraft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я полагал, что функция(на то она и функция) должна возвращать значение, а не подставляться по шаблону.
Это значение передается в INSERT всего один раз! Почему вдруг RULE вызывает эту функцию, когда оно(RULE) о ней вообще ничего знать не должно в принципе. Не понимаю.
Вы обратите внимание, в таблице нет DEFAULT, это обычный biginteger!
...
Рейтинг: 0 / 0
PostgreSQL Разделение таблиц - очень странное поведение
    #34516363
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MySQLCraft Вы обратите внимание, в таблице нет DEFAULT, это обычный biginteger!и что с того?
вам уже объяснили, что унутренняя кухня рулей в посгресе такова, примите это как данность.

по поводу "не понимаю" - можете запустить поиск тут или прямо в багс-ах постгревого сайта. там это поведение давно опписсано. также есть отписки разработчиков, что так оно и будет иметь место быть. т.к. "руле это скорее макрос" и т.п. в том же духе.

Т.ч., если хотите чтобы передача nextval и т.п. была бы возможна, распишите просто безусловную передачу в руле
DO INSTEAD
SELECT MyProc(New.ID , New.xxx,...)
в которой (MyProc) уже и расписывайте условные вставки. Вызов переданных данных в ХП работает нормально - именно как данных, а не как всякий раз интерпретируемых строк.
...
Рейтинг: 0 / 0
PostgreSQL Разделение таблиц - очень странное поведение
    #34516375
st_serg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
docs
...
It is important to realize that a rule is really a command transformation mechanism, or command macro. The transformation happens before the execution of the commands starts. If you actually want an operation that fires independently for each physical row, you probably want to use a trigger, not a rule. More information about the rules system is in Chapter 35, The Rule System.
...
...
Рейтинг: 0 / 0
PostgreSQL Разделение таблиц - очень странное поведение
    #34516385
MySQLCraft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4321поведение стандартно для РУЛЕ постгреса. Любое упоминание NEW.id (и в условии и в исполняемой строке) приводит к вычислению переданной в INSERT (UPDATE) ф-ии.

выходы :
1. (искуственный) перед вставкой вызвать nextval, в самой вставке - всегда и только curval (вызов не приводит к смене значения)
2. вместо руле юзать ХП (вернее в _безусловном_ руле вызвать ХП, которая _внутри_себя_ уже поделит по таблицам. У ХП таких болезней "неатомарности" нет)
3. (бесполезный) высказаться по поводу ... прелестей ... и их ... разработчиков в "баги" (там уже и без вас на эту тему есть возмущения, можете ссылки найти тут поиском)

А вообще, спасибо! Замена nextval на nextval и currval помогла...
Юзать ХП? я как раз от этого варианта на MySQL хотел перейти на RULE PostgreSQL.
Если это выход, то преимуществ PostgreSQL в этом плане не вижу.
...
Рейтинг: 0 / 0
PostgreSQL Разделение таблиц - очень странное поведение
    #34516417
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MySQLCraft Юзать ХП? я как раз от этого варианта на MySQL хотел перейти на RULE PostgreSQL.
Если это выход, то преимуществ PostgreSQL в этом плане не вижу.ну, я же предложил юзать РУЛЕ, дергающее ХП (т.е. не юзьвер юзает ХаПу, а руля - юзанье ХаПы, таким разом, сокрыто от).
(Или же можно навесить триггер, как это рекомендует ДОКа)
...
Рейтинг: 0 / 0
PostgreSQL Разделение таблиц - очень странное поведение
    #34516469
MySQLCraft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4321 MySQLCraft Юзать ХП? я как раз от этого варианта на MySQL хотел перейти на RULE PostgreSQL.
Если это выход, то преимуществ PostgreSQL в этом плане не вижу.ну, я же предложил юзать РУЛЕ, дергающее ХП (т.е. не юзьвер юзает ХаПу, а руля - юзанье ХаПы, таким разом, сокрыто от).
(Или же можно навесить триггер, как это рекомендует ДОКа)

В таком ключе и буду дальше пытаться.

Вот только меня настораживает, что реализация автоинкремента через ХП и триггеры не есть гуд(может привести к ошибке и замедляет вставку). Это не мое мнение, я как раз раньше, в Interbase и в MySQL всегда реализовывал автоинкремент через триггеры. Но меня убедили знатоки СУБД, что это очень непрофессионально, ненадежно и медленно.
...
Рейтинг: 0 / 0
PostgreSQL Разделение таблиц - очень странное поведение
    #34516548
MySQLCraft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ладно замяли с преимуществами... не хочу развивать флейм.

Вопрос перерастает в другой

Как в процедуре или триггере в инсерте использовать переменное(вичисленное) имя таблицы?
...
Рейтинг: 0 / 0
PostgreSQL Разделение таблиц - очень странное поведение
    #34516582
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MySQLCraft Как в процедуре или триггере в инсерте использовать переменное(вичисленное) имя таблицы?для партицирования вообще говоря надобности не вижу (число результатов заведомо задано)

а в общем случае:

EXECUTE 'INSERT ... ' || _tablename || '.... VALUES ...'
...
Рейтинг: 0 / 0
PostgreSQL Разделение таблиц - очень странное поведение
    #34516656
MySQLCraft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4321 MySQLCraft Как в процедуре или триггере в инсерте использовать переменное(вичисленное) имя таблицы?для партицирования вообще говоря надобности не вижу (число результатов заведомо задано)

а в общем случае:

EXECUTE 'INSERT ... ' || _tablename || '.... VALUES ...'

Число результатов заранее не задано, количество разделов зависит от первичного ключа.
Однако, общий случай подходит, т.к. ничего другого не придумать.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / PostgreSQL Разделение таблиц - очень странное поведение
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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