免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3488 | 回复: 3
打印 上一主题 下一主题

trigger function的问题,或者 postgreSQL下的upsert!?? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-14 23:48 |只看该作者 |倒序浏览
大家好:
因为作业的关系刚刚接触数据库
主要希望完成这样一件事情:

表如下:
=================================
CREATE TABLE download
(
  id integer NOT NULL DEFAULT nextval('seq'::regclass),
  songid integer NOT NULL,
  counter integer NOT NULL,
  weeknumber integer NOT NULL,
  CONSTRAINT download_pkey PRIMARY KEY (id ),
  CONSTRAINT download_songid_fkey FOREIGN KEY (songid)
      REFERENCES song (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (
  OIDS=FALSE
);
ALTER TABLE download
  OWNER TO postgres;
==================================
想在程序中使用 :
==================================
insert into download (weeknumber, singerid, counter) values ((SELECT EXTRACT(WEEK FROM (SELECT CURRENT_TIMESTAMP))),

?, 1)
==================================
进行插入操作, 逻辑是:如果有 weeknumber 和 singerid 组合存在的话,就对那条已经存在的记录中的 counter 字段进行 +1 操

作;如果不存在就执行插入操作。
所以希望写一个触发器,再程序中只用上面的代码,具体是 INSERT 还是 UPDATE 都有数据库来判断。但是
我自己的触发器完全的不工作,还是贴出来给大家批评批评吧!
===================================
CREATE OR REPLACE FUNCTION download_counter()
  RETURNS trigger AS
$BODY$
DECLARE
tmpid INTEGER;
BEGIN
SELECT id INTO tmpid FROM download WHERE songid=NEW.songid AND weeknumber=NEW.weeknumber;
IF NOT FOUND THEN
RETURN NEW;
ELSE
UPDATE download SET counter=counter+1 WHERE id=NEW.id;
RETURN NEW;
END IF;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION download_counter()
  OWNER TO postgres;
===================================
CREATE TRIGGER update_or_insert
  BEFORE INSERT
  ON download
  FOR EACH ROW
  EXECUTE PROCEDURE download_counter();
===================================
知道MySQL里有upsert 貌似可以实现类似的功能,但是postgre里面好像没有。。。。
不只有那位大侠可以帮忙解决下这个问题,非常感谢了 !

论坛徽章:
0
2 [报告]
发表于 2011-12-15 00:10 |只看该作者
好吧!在经历了将近4个小时的试错法后,终于解决了:
===========================================
CREATE OR REPLACE FUNCTION download_counter()
  RETURNS trigger AS
$BODY$
DECLARE
tmpid INTEGER;
tmpcounter INTEGER;
tmpweeknumber INTEGER;
tmpsong INTEGER;
BEGIN
SELECT id,songid,counter,weeknumber INTO tmpid,tmpsong,tmpid,tmpcounter,tmpcounter FROM download WHERE

songid=NEW.songid AND weeknumber=NEW.weeknumber;
IF NOT FOUND THEN
RETURN NEW;
ELSE
UPDATE download SET counter=counter+1;
END IF;
RETURN OLD;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION download_counter()
  OWNER TO postgres;
========================================

问题果然是处在 RETURN type 上面,不知道那位打给可以给详解一下这个 OLD和NEW 到底指的是什么!!!谢谢了!

论坛徽章:
0
3 [报告]
发表于 2011-12-15 00:35 |只看该作者
不好意思!少了点东西!...
======================================

CREATE OR REPLACE FUNCTION download_counter()
  RETURNS trigger AS
$BODY$
DECLARE
tmpid INTEGER;
tmpcounter INTEGER;
tmpweeknumber INTEGER;
tmpsong INTEGER;
BEGIN
SELECT id,songid,counter,weeknumber INTO tmpid,tmpsong,tmpid,tmpcounter,tmpcounter FROM download WHERE

songid=NEW.songid AND weeknumber=NEW.weeknumber;
IF NOT FOUND THEN
RETURN NEW;
ELSE
UPDATE download SET counter=counter+1 WHERE songid=NEW.songid AND weeknumber=NEW.weeknumber;
END IF;
RETURN OLD;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION download_counter()
  OWNER TO postgres;

论坛徽章:
59
2015七夕节徽章
日期:2015-08-24 11:17:25ChinaUnix专家徽章
日期:2015-07-20 09:19:30每周论坛发贴之星
日期:2015-07-20 09:19:42ChinaUnix元老
日期:2015-07-20 11:04:38荣誉版主
日期:2015-07-20 11:05:19巳蛇
日期:2015-07-20 11:05:26CU十二周年纪念徽章
日期:2015-07-20 11:05:27IT运维版块每日发帖之星
日期:2015-07-20 11:05:34操作系统版块每日发帖之星
日期:2015-07-20 11:05:36程序设计版块每日发帖之星
日期:2015-07-20 11:05:40数据库技术版块每日发帖之星
日期:2015-07-20 11:05:432015年辞旧岁徽章
日期:2015-07-20 11:05:44
4 [报告]
发表于 2011-12-21 21:35 |只看该作者
使用程序接口就可以了啊。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP