Re: funny update, say update 1, updated 1 added 2nd. - Mailing list pgsql-sql
From | Jim Buttafuoco |
---|---|
Subject | Re: funny update, say update 1, updated 1 added 2nd. |
Date | |
Msg-id | 20050616140431.M78590@contactbda.com Whole thread Raw |
In response to | funny update, say update 1, updated 1 added 2nd. (Neil Dugan <postgres@butterflystitches.com.au>) |
List | pgsql-sql |
works fine for me. Do you have any triggers on the tables or other rules? Can you provide a complete SQL script that starts from an empty database. Jim ---------- Original Message ----------- From: Neil Dugan <postgres@butterflystitches.com.au> To: pgsql-sql@postgresql.org Sent: Thu, 16 Jun 2005 13:38:58 +1000 Subject: [SQL] funny update, say update 1, updated 1 added 2nd. > I have been having some trouble with a particular table view. An UPDATE > command is not only changing the applicable record it is also creating a > new record as well. > > wholesale=# select * from accounts_supplier; > id | name | contact | addr | addr2 | town | postcode | state | phone | fax | account_type > ----+------------------+---------+-----------+-------+----------------+----------+-------+-------+-----+-------------- > 1 | ABC construction | TOM | | | | | NSW | | | Cash Only > 2 | test | | | | | | | | | 7 Day > 3 | build-4-U | boss | somewhere | | back of beyond | | | | | 7 Day > (3 rows) > > wholesale=# update accounts_supplier set addr='nowhere' where id=3; > UPDATE 1 > wholesale=# select * from accounts_supplier; > id | name | contact | addr | addr2 | town | postcode | state | phone | fax | account_type > ----+------------------+---------+---------+-------+----------------+----------+-------+-------+-----+-------------- > 1 | ABC construction | TOM | | | | | NSW | | | Cash > Only 2 | test | | | | | | | | | 7 > Day 6 | build-4-U | boss | nowhere | | back of beyond | | | | | 7 > Day 3 | build-4-U | boss | nowhere | | back of beyond | | | | | 7 Day > (4 rows) > > Can anyone tell me why this is happening and how to fix it. > > Here are the table and view definitions. > > CREATE TABLE account_type ( > number smallint, > name character varying(20) > ); > > CREATE TABLE address ( > addr character varying(40), > addr2 character varying(40), > town character varying(20), > postcode character varying(10), > state character(4) > ); > > CREATE TABLE supplier ( > id bigserial NOT NULL, > name character varying(40), > phone character varying(20), > fax character varying(20), > contact character varying(40), > account_type smallint DEFAULT 0 > ) > INHERITS (address); > > CREATE VIEW accounts_supplier AS > SELECT supplier.id, > supplier.name, > supplier.contact, > supplier.addr, > supplier.addr2, > supplier.town, > supplier.postcode, > supplier.state, > supplier.phone, > supplier.fax, > account_type.name AS account_type > FROM supplier, account_type > WHERE (account_type.number = supplier.account_type); > > CREATE RULE accounts_supplier_update > AS ON UPDATE TO accounts_supplier > DO INSTEAD UPDATE supplier > SET name = new.name, > contact = new.contact, > addr = new.addr, > addr2 = new.addr2, > town = new.town, > postcode = new.postcode, > state = upper((new.state)::text), > phone = new.phone, > fax = new.fax, > account_type = (SELECT account_type.number > FROM account_type > WHERE ((account_type.name)::text = (new.account_type)::text)) > WHERE (supplier.id = new.id); > > wholesale=# select version(); > version > -------------------------------------------------------------------------------------------------------------------------- > PostgreSQL 7.4.8 on i386-redhat-linux-gnu, compiled by GCC i386-redhat-linux-gcc (GCC) 3.4.3 20050227 (Red > Hat 3.4.3-22) > (1 row) > > wholesale=# select * from account_type; > number | name > --------+----------- > 0 | Cash Only > 1 | 7 Day > 2 | 30 Day > 3 | 60 Day > 4 | 90 Day > (5 rows) > > Thanks for any help > Regards Neil. > > ---------------------------(end of broadcast)--------------------------- > TIP 5: Have you checked our extensive FAQ? > > http://www.postgresql.org/docs/faq ------- End of Original Message -------