Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
PostgreSQL Разделение таблиц - очень странное поведение
|
|||
|---|---|---|---|
|
#18+
Исследую возможности и невозможности 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'); всё работает правильно... а вместе никак! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2007, 11:52 |
|
||
|
PostgreSQL Разделение таблиц - очень странное поведение
|
|||
|---|---|---|---|
|
#18+
поведение стандартно для РУЛЕ постгреса. Любое упоминание NEW.id (и в условии и в исполняемой строке) приводит к вычислению переданной в INSERT (UPDATE) ф-ии. выходы : 1. (искуственный) перед вставкой вызвать nextval, в самой вставке - всегда и только curval (вызов не приводит к смене значения) 2. вместо руле юзать ХП (вернее в _безусловном_ руле вызвать ХП, которая _внутри_себя_ уже поделит по таблицам. У ХП таких болезней "неатомарности" нет) 3. (бесполезный) высказаться по поводу ... прелестей ... и их ... разработчиков в "баги" (там уже и без вас на эту тему есть возмущения, можете ссылки найти тут поиском) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2007, 14:03 |
|
||
|
PostgreSQL Разделение таблиц - очень странное поведение
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2007, 14:07 |
|
||
|
PostgreSQL Разделение таблиц - очень странное поведение
|
|||
|---|---|---|---|
|
#18+
Я полагал, что функция(на то она и функция) должна возвращать значение, а не подставляться по шаблону. Это значение передается в INSERT всего один раз! Почему вдруг RULE вызывает эту функцию, когда оно(RULE) о ней вообще ничего знать не должно в принципе. Не понимаю. Вы обратите внимание, в таблице нет DEFAULT, это обычный biginteger! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2007, 14:21 |
|
||
|
PostgreSQL Разделение таблиц - очень странное поведение
|
|||
|---|---|---|---|
|
#18+
MySQLCraft Вы обратите внимание, в таблице нет DEFAULT, это обычный biginteger!и что с того? вам уже объяснили, что унутренняя кухня рулей в посгресе такова, примите это как данность. по поводу "не понимаю" - можете запустить поиск тут или прямо в багс-ах постгревого сайта. там это поведение давно опписсано. также есть отписки разработчиков, что так оно и будет иметь место быть. т.к. "руле это скорее макрос" и т.п. в том же духе. Т.ч., если хотите чтобы передача nextval и т.п. была бы возможна, распишите просто безусловную передачу в руле DO INSTEAD SELECT MyProc(New.ID , New.xxx,...) в которой (MyProc) уже и расписывайте условные вставки. Вызов переданных данных в ХП работает нормально - именно как данных, а не как всякий раз интерпретируемых строк. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2007, 14:30 |
|
||
|
PostgreSQL Разделение таблиц - очень странное поведение
|
|||
|---|---|---|---|
|
#18+
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. ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2007, 14:32 |
|
||
|
PostgreSQL Разделение таблиц - очень странное поведение
|
|||
|---|---|---|---|
|
#18+
4321поведение стандартно для РУЛЕ постгреса. Любое упоминание NEW.id (и в условии и в исполняемой строке) приводит к вычислению переданной в INSERT (UPDATE) ф-ии. выходы : 1. (искуственный) перед вставкой вызвать nextval, в самой вставке - всегда и только curval (вызов не приводит к смене значения) 2. вместо руле юзать ХП (вернее в _безусловном_ руле вызвать ХП, которая _внутри_себя_ уже поделит по таблицам. У ХП таких болезней "неатомарности" нет) 3. (бесполезный) высказаться по поводу ... прелестей ... и их ... разработчиков в "баги" (там уже и без вас на эту тему есть возмущения, можете ссылки найти тут поиском) А вообще, спасибо! Замена nextval на nextval и currval помогла... Юзать ХП? я как раз от этого варианта на MySQL хотел перейти на RULE PostgreSQL. Если это выход, то преимуществ PostgreSQL в этом плане не вижу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2007, 14:34 |
|
||
|
PostgreSQL Разделение таблиц - очень странное поведение
|
|||
|---|---|---|---|
|
#18+
MySQLCraft Юзать ХП? я как раз от этого варианта на MySQL хотел перейти на RULE PostgreSQL. Если это выход, то преимуществ PostgreSQL в этом плане не вижу.ну, я же предложил юзать РУЛЕ, дергающее ХП (т.е. не юзьвер юзает ХаПу, а руля - юзанье ХаПы, таким разом, сокрыто от). (Или же можно навесить триггер, как это рекомендует ДОКа) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2007, 14:41 |
|
||
|
PostgreSQL Разделение таблиц - очень странное поведение
|
|||
|---|---|---|---|
|
#18+
4321 MySQLCraft Юзать ХП? я как раз от этого варианта на MySQL хотел перейти на RULE PostgreSQL. Если это выход, то преимуществ PostgreSQL в этом плане не вижу.ну, я же предложил юзать РУЛЕ, дергающее ХП (т.е. не юзьвер юзает ХаПу, а руля - юзанье ХаПы, таким разом, сокрыто от). (Или же можно навесить триггер, как это рекомендует ДОКа) В таком ключе и буду дальше пытаться. Вот только меня настораживает, что реализация автоинкремента через ХП и триггеры не есть гуд(может привести к ошибке и замедляет вставку). Это не мое мнение, я как раз раньше, в Interbase и в MySQL всегда реализовывал автоинкремент через триггеры. Но меня убедили знатоки СУБД, что это очень непрофессионально, ненадежно и медленно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2007, 14:52 |
|
||
|
PostgreSQL Разделение таблиц - очень странное поведение
|
|||
|---|---|---|---|
|
#18+
Ладно замяли с преимуществами... не хочу развивать флейм. Вопрос перерастает в другой Как в процедуре или триггере в инсерте использовать переменное(вичисленное) имя таблицы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2007, 15:11 |
|
||
|
PostgreSQL Разделение таблиц - очень странное поведение
|
|||
|---|---|---|---|
|
#18+
MySQLCraft Как в процедуре или триггере в инсерте использовать переменное(вичисленное) имя таблицы?для партицирования вообще говоря надобности не вижу (число результатов заведомо задано) а в общем случае: EXECUTE 'INSERT ... ' || _tablename || '.... VALUES ...' ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2007, 15:19 |
|
||
|
PostgreSQL Разделение таблиц - очень странное поведение
|
|||
|---|---|---|---|
|
#18+
4321 MySQLCraft Как в процедуре или триггере в инсерте использовать переменное(вичисленное) имя таблицы?для партицирования вообще говоря надобности не вижу (число результатов заведомо задано) а в общем случае: EXECUTE 'INSERT ... ' || _tablename || '.... VALUES ...' Число результатов заранее не задано, количество разделов зависит от первичного ключа. Однако, общий случай подходит, т.к. ничего другого не придумать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2007, 15:36 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=34516385&tid=2005464]: |
0ms |
get settings: |
10ms |
get forum list: |
20ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
34ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
66ms |
get tp. blocked users: |
2ms |
| others: | 253ms |
| total: | 405ms |

| 0 / 0 |
