LINUX.ORG.RU

Postgres SQL Условное добавление данных


0

0

Столкнулся вот с какой проблеммой.

Есть таблица с уникальным полем. В нее добавляются данные. Добвляется 1000 строк из которых 10 повторяют данное уникальное поле.

Можно ли создать какое-нибудь правило о том что если поле повторяется догда делать не INSERT а UPDATE данной записи по другим полям. Или может поможет како-нибудь триггер или сделать условная транзакция?

Спасибо.

PS. А можно ли заставить триггер (INSERT) срабатывать только при определенных значениях некоторых добавляемых данных?


Вроде был такой запрос — INSERT OR UPDATE.
Но вот где был — не помню. Может, и в постгресе.

nnz ★★★★
()
Ответ на: комментарий от nnz

В мускуле

   
      CREATE TABLE ipstat(ip int UNSIGNED NOT NULL PRIMARY KEY,
   
                                hits int UNSIGNED NOT NULL,
   
                                last_hit timestamp);
   
       
   
      INSERT INTO ipstat VALUES(inet_aton('192.168.0.1'),1,now())
   
                             ON duplicate KEY UPDATE hits=hits+1;

В постгресе я такого не видел. Можно например заапдейдить, посмотреть количество заапдейченных строк, если 0 - INSERT.

vga ★★
()
Ответ на: комментарий от ibm

На будующее, вдруг кому пригодится нашел еще один пример тут

http://codingforums.com/showthread.php?t=52346

CREATE TABLE user_stocks_table ( user_id varchar(20), stock_symbol char(3), amount integer );

CREATE RULE insert_on_duplicate_update_user_stocks_table AS ON insert TO user_stocks_table WHERE (new.user_id, new.stock_symbol) IN ( SELECT user_id, stock_symbol FROM user_stocks_table WHERE user_id=new.user_id AND stock_symbol=new.stock_symbol) DO INSTEAD UPDATE user_stocks_table SET amount = amount + new.amount WHERE user_id=new.user_id AND stock_symbol=new.stock_symbol;

ibm
() автор топика
Ответ на: комментарий от ibm

Вообще вариант с функцией - быстрее работает в теории, потому что если есть - то сразу апдейт, а если инсерт-то (неявный селект для поиска)+инсерт. У тебя же всегда селект + (селект для поиска) + апдейт или инсерт.

Тут уж смотри, что тебе важнее, скорость или привычность записи. Ну и можно на практике пробенчмаркить, конечно, я так, теоретически написал.

vga ★★
()
Ответ на: комментарий от bibi

http://en.wikibooks.org/wiki/Converting_MySQL_to_PostgreSQL

Та я как бы не мускульщик, так, интересовался когда-то.

Ну и пример оттуда страдает тем же - сначала селект, а потом апдейт или инсерт. А апдейт, а если не вышло инсерт - написан в доке, официальной, думаю, что неспроста.

vga ★★
()
Ответ на: комментарий от vga

Ну и пример оттуда страдает тем же - сначала селект, а потом апдейт или инсерт. А апдейт, а если не вышло инсерт - написан в доке, официальной, думаю, что неспроста.

Да, пример оттуда явно не фонтан. AFAIR где-то была техника лучше. Впрочем, я уже не помню. Редко использую постгрес.

bibi
()

Вроде, это UPSERT называлось. У мускля свой костыль on duplicate key update, который, однако, отлично работает.

true_admin ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.