Antw: Insert with replace?
От | Gerhard Dieringer |
---|---|
Тема | Antw: Insert with replace? |
Дата | |
Msg-id | s937782f.046@kopo001 обсуждение исходный текст |
Список | pgsql-sql |
Wampler, Steve wrote: > ... > I've got a database that (logically) represents a set of > items, where each item has a primary key represented by two > columns (id and name). If that key isn't in the database, > I want to insert the item. If that key is in the database, I want > to update the item. I have no need to retain the previous > values. > You can solve your problem with a trigger and a view, that has the same attributes as your table. You insert the data into the view, not the table. The trigger first looks, if a row with that primary key is allready inthe table and decides, if to use update or insert into the table. example: create table test_table ( id int4 primary key, data text); create view test_view as select id, data from test_table; create function insert_or_update() returns opaque as ' declare lid int4; begin select t.id into lid from test_tablet where t.id = new.id; if found then update test_table set data = new.data where id = new.id; else insert into test_table values (new.id, new.data); end if; return null; end; ' language 'plpgsql'; create trigger insert_or_update_trigger before insert on test_view for each row execute procedure insert_or_update(); Of course this solution has some drawbacks. PostgreSQL always returns INSERT 0 0, because the insert into the view is canceled by returning null in the trigger. But it works. Test it with two inserts, that do insert insert into test_view values (1,'one'); insert into test_view values (2,'two'); select * from test_view; Now an insert that dose an update: insert into test_view values (1,'ONE'); select * from test_view; Gerhard
В списке pgsql-sql по дате отправления: