- Mailing list pgsql-general

From Erin Millard
Subject
Date
Msg-id 34D82263C3F0674FAAACF2B7BB039CAE63CB18@server.I-NEX.local
Whole thread Raw
List pgsql-general
I am facing a difficult problem with setting up a rule.

The rule is essentially designed to allow updates to a view made up of
data from two tables.

Here is a simplified example to reproduce the problem:


--
-- clear the table and view
--

DROP VIEW IF EXISTS full_view;
DROP TABLE IF EXISTS child_table;
DROP TABLE IF EXISTS base_table;

--
-- create the tables
--

CREATE TABLE base_table
(

    id INTEGER,
    base_data CHAR(1)

);

CREATE TABLE child_table
(

    id INTEGER,
    child_data CHAR(1)

);

--
-- create the view
--

CREATE VIEW full_view AS
(

    SELECT
        base.id,
        base.base_data,
        child.child_data
    FROM base_table AS base
    INNER JOIN child_table AS child ON child.id = base.id

);

--
-- create update rule
--

CREATE RULE view_update AS
ON UPDATE TO full_view
DO INSTEAD
(

    UPDATE base_table
    SET
        id = NEW.id,
        base_data = NEW.base_data
    WHERE id = OLD.id;

    UPDATE child_table
    SET
        id = NEW.id,
        child_data = NEW.child_data
    WHERE id = OLD.id;

);

--
-- insert some data
--

INSERT INTO base_table (id, base_data) VALUES (1, 'a');
INSERT INTO child_table (id, child_data) VALUES (1, 'b');

--
-- everything is OK so far
--

SELECT * FROM full_view;

--
-- this query works as expected
--

UPDATE full_view SET child_data = 'c' WHERE base_data = 'a';

--
-- child_data has been updated
--

SELECT * FROM full_view;

--
-- this query does not work as expected
--

UPDATE full_view SET child_data = 'd', base_data = 'e' WHERE base_data =
'a';

--
-- child_data has not been updated, even though base_data was
--

SELECT * FROM full_view;


I think I understand why this happens. It seems logical that the first
query of the update rule is being run and then the second matches no
rows for "base_data = 'a'" because it was updated by the first.

Can anyone think of a workaround that would let me achieve this
functionality? Like, perhaps "caching" the resulting changes from the
first update query and only applying them after the second is run?


---
Erin Millard
Systems Analyst
I-Nex Corporation Pty Ltd

pgsql-general by date:

Previous
From: Reg Me Please
Date:
Subject: Re: Postgresql simple query performance question
Next
From: novice
Date:
Subject: Re: posgresql-8.2 startup problem