谁能帮我编一个触发器函数(PostgreSQL)

shanhengshu 2009-10-30 05:24:23
我有一个表,人为控制记录为100行,有一个级别列分为5个级别(赋值0,1,2,3,4),分别控制在50行,10行,10行,10行,10行(在总行不超过100行时允许各级别超出限制),现在要写一个触发器,在插入第101条数据时,按级别删除已有数据,使每个级别都要在规定行数之内。

各位高人帮帮我想想怎么写这个触发器???


id severity
1 0
2 0
3 0
…………
13 0
14 1
…………
…………
100 4


由于plpgsql语言不能嵌套,实在是想不出来怎样实现了,各位帮忙想想,先谢谢了!!!
...全文
97 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
ACMAIN_CHM 2009-10-31
  • 打赏
  • 举报
回复
PostgreSQL 8.4.0 Documentation手册中的例子。可以嵌套啊。

IF demo_row.sex = 'm' THEN
pretty_sex := 'man';
ELSE
IF demo_row.sex = 'f' THEN
pretty_sex := 'woman';
END IF;
END IF;
trainee 2009-10-31
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 shanhengshu 的回复:]
其实实现过程我知道,就是函数不会写,plpgsql语言不能嵌套,而我想的需要if中套一层if,怎样能够实现这样一个逻辑呢???
希望高手指点!!!
[/Quote]
可以嵌套啊,plpgsql功能很全。
shanhengshu 2009-10-31
  • 打赏
  • 举报
回复
其实实现过程我知道,就是函数不会写,plpgsql语言不能嵌套,而我想的需要if中套一层if,怎样能够实现这样一个逻辑呢???
希望高手指点!!!
ACMAIN_CHM 2009-10-31
  • 打赏
  • 举报
回复


实践如下。


csdn=# CREATE FUNCTION sp_shanhengshu(t integer)  RETURNS integer AS $$
csdn$# BEGIN
csdn$#
csdn$# IF t > 0
csdn$# THEN
csdn$# RETURN 1;
csdn$# ELSE
csdn$# IF t < 0
csdn$# THEN
csdn$# RETURN -1;
csdn$# ELSE
csdn$# RETURN 0;
csdn$# END IF;
csdn$# END IF;
csdn$# END;
csdn$# $$ LANGUAGE plpgsql;
CREATE FUNCTION
csdn=# select sp_shanhengshu(10);
sp_shanhengshu
----------------
1
(1 row)


csdn=# select sp_shanhengshu(-9);
sp_shanhengshu
----------------
-1
(1 row)


csdn=#
vinsonshen 2009-10-31
  • 打赏
  • 举报
回复
2. 安装一个 PostgreSQL, 勇于实践,伟人说得好“实践是检验的标准”, 我把“唯一”两个字去掉了


::)
ACMAIN_CHM 2009-10-31
  • 打赏
  • 举报
回复
[Quote]我上次看到一个帖子说不能够嵌套的,那我可以这样写吗?[/Quote]

对楼主的两个小建议

1. 网上到 PostgreSQL 的官网或者其它网站下载一个文档手册。 然后粗看一遍。
2. 安装一个 PostgreSQL, 勇于实践,伟人说得好“实践是检验的标准”, 我把“唯一”两个字去掉了。
vinsonshen 2009-10-31
  • 打赏
  • 举报
回复
晕,你看什么帖子说的?
我看的是PostgreSQL文档哦,摘里面的相关内容如下,你参考下吧:

35.7.2. 条件
IF 语句让你可以根据某种条件执行命令。 PL/pgSQL有五种形式的IF:



IF ... THEN

IF ... THEN ... ELSE

IF ... THEN ... ELSE IF

IF ... THEN ... ELSIF ... THEN ... ELSE

IF ... THEN ... ELSEIF ... THEN ... ELSE


35.7.2.1. IF-THEN
IF boolean-expression THEN
statements
END IF;
IF-THEN语句是IF的最简单形式。如果条件为真, 在THEN和END IF之间的语句将被执行。 否则,将忽略它们。

例子:

IF v_user_id <> 0 THEN
UPDATE users SET email = v_email WHERE user_id = v_user_id;
END IF;

35.7.2.2. IF-THEN-ELSE
IF boolean-expression THEN
statements
ELSE
statements
END IF;
IF-THEN-ELSE语句增加了IF-THEN的分支, 让你可以声明在条件计算结果为假的时候执行的语句。

例子:

IF parentid IS NULL OR parentid = ''
THEN
RETURN fullname;
ELSE
RETURN hp_true_filename(parentid) || '/' || fullname;
END IF;

IF v_count > 0 THEN
INSERT INTO users_count(count) VALUES(v_count);
RETURN 't';
ELSE
RETURN 'f';
END IF;

35.7.2.3. IF-THEN-ELSE IF
IF语句可以嵌套并且在下面的例子中:

IF demo_row.sex = 'm' THEN
pretty_sex := 'man';
ELSE
IF demo_row.sex = 'f' THEN
pretty_sex := 'woman';
END IF;
END IF;

如果你使用这种形式,那么你实际上就是在另外一个IF语句的ELSE 部分嵌套了一个IF语句.因此你需要一个END IF语句 给每个嵌套的IF,另外还要一个给父IF-ELSE用. 这么干是可以的,但是如果我们有太多候选项需要检查,那么就会变得很乏味. 因此有下面的形式。

35.7.2.4. IF-THEN-ELSIF-ELSE
IF boolean-expression THEN
statements
[ ELSIF boolean-expression THEN
statements
[ ELSIF boolean-expression THEN
statements
...]]
[ ELSE
statements ]
END IF;
IF-THEN-ELSIF-ELSE提供了一种更方便的方法用于在一条语句中检查许多候选条件。 形式上它和嵌套的IF-THEN-ELSE-IF-THEN命令相同, 但是只需要一个END IF。

这里是一个例子:

IF number = 0 THEN
result := 'zero';
ELSIF number > 0 THEN
result := 'positive';
ELSIF number < 0 THEN
result := 'negative';
ELSE
-- 另外一个唯一的可能是它是空值
result := 'NULL';
END IF;

35.7.2.5. IF-THEN-ELSEIF-ELSE
ELSEIF 是 ELSIF 的别名。

shanhengshu 2009-10-31
  • 打赏
  • 举报
回复
我上次看到一个帖子说不能够嵌套的,那我可以这样写吗?


if 条件1 then
……;
eles
if 条件2 then
……;
end if;
if 条件3 then
……;
end if;
if 条件4 then
……;
end if;
.
.
.
end if;
vinsonshen 2009-10-31
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 shanhengshu 的回复:]
其实实现过程我知道,就是函数不会写,plpgsql语言不能嵌套,而我想的需要if中套一层if,怎样能够实现这样一个逻辑呢???
希望高手指点!!!
[/Quote]

这个可以这样写:

IF 条件1 THEN
...
ELSIF 条件2 THEN
...
ELSIF 条件3 THEN
...
END IF;

百年树人 2009-10-30
  • 打赏
  • 举报
回复
postgresql的没搞过,楼主可以参考一下这个链接

http://www.pgsqldb.org/pgsqldoc-8.1c/plpgsql-trigger.html#PLPGSQL-TRIGGER-EXAMPLE

56,940

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧