Re: RULES doesn't work as expected
От | Richard Huxton |
---|---|
Тема | Re: RULES doesn't work as expected |
Дата | |
Msg-id | 41E50866.1090007@archonet.com обсуждение исходный текст |
Ответ на | RULES doesn't work as expected ("John Hansen" <john@geeknet.com.au>) |
Список | pgsql-bugs |
Removed cc to pgsql-patches since that's not the list for this. John Hansen wrote: > It seems rules don't work as expected. > I could be wrong,... In which case, what am I doing wrong? A rule is like a macro, rewriting the query plan. You're trying to use it as though it is a trigger. The side-effects of rules can be quite subtle and catches most of us out at least once. > Clearly, the first insert below should not update the table as well. > CREATE TABLE test (a text, b int4[]); > > CREATE RULE test_rule AS > ON INSERT TO test > WHERE exists(SELECT 1 FROM test WHERE a = NEW.a) > DO INSTEAD > UPDATE test SET b = b + NEW.b WHERE a = NEW.a; > > > db1=# INSERT INTO test (a,b) VALUES (1,'{1}'::int4[]); The NEW.a doesn't refer to a variable as such, it refers to the updated/inserted value of an actual row in "test". Does that clarify? In your particular usage you'd want to consider concurrency and locking issues too. Repost your question on the general/sql lists if you'd like some discussion. It's probably worth checking the list archives too - plenty in there about rule/trigger differences. -- Richard Huxton Archonet Ltd
В списке pgsql-bugs по дате отправления: