谁能帮我编一个触发器函数(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语言不能嵌套,实在是想不出来怎样实现了,各位帮忙想想,先谢谢了!!!
...全文
91 10 打赏 收藏 转发到动态 举报
写回复
用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
PostgreSQL是以加州大学伯克利分校计算机系开发的POSTGRES,现在已经更名为PostgreSQL. PostgreSQL支持大部分SQL标准并且提供了许多其它现代特性:复杂查询、外键、触发器、视图、事务完整性等。PostgreSQL 是一个免费的对象-关系数据库服务器(数据库管理系统),它在灵活的 BSD-风格许可证下发行。它提供了相对其他开放源代码数据库系统(比如 MySQL 和 Firebird),和专有系统(比如 Oracle、Sybase、IBM 的 DB2 和 Microsoft SQL Server)之外的另一种选择。事实上, PostgreSQL 的特性覆盖了 SQL-2/SQL-92 和 SQL-3/SQL-99,首先,它包括了可以说是目前世界上最丰富的数据类型的支持,其中有些数据类型可以说连商业数据库都不具备, 比如 IP 类型和几何类型等;其次,PostgreSQL 是全功能的自由软件数据库,很长时间以来,PostgreSQL 是唯一支持事务、子查询、多版本并行控制系统(MVCC)、数据完整性检查等特性的唯一的一种自由软件的数据库管理系统。 Inprise 的 InterBase 以及SAP等厂商将其原先专有软件开放为自由软件之后才打破了这个唯一。最后,PostgreSQL拥有一支非常活跃的开发队伍,而且在许多黑客的努力下,PostgreSQL 的质量日益提高。从技术角度来讲,PostgreSQL 采用的是比较经典的C/S(client/server)结构,也就是一个客户端对应一个服务器端守护进程的模式,这个守护进程分析客户端来的查询请求,生成规划树,进行数据检索并最终把结果格式化输出后返回给客户端。为了便于客户端的程序的写,由数据库服务器提供了统一的客户端 C 接口。而不同的客户端接口都是源自这个 C 接口,比如ODBC,JDBC,Python,Perl,Tcl,C/C++,ESQL等, 同时也要指出的是,PostgreSQL 对接口的支持也是非常丰富的,几乎支持所有类型的数据库客户端接口。这一点也可以说是 PostgreSQL 一大优点。本课程作为PostgreSQL数据库管理一,主要讲解以下内容: 1.     PostgreSQL 存储过程基本知识2.     PostgreSQL 用户自定义函数3.     PostgreSQL 控制结构4.     PostgreSQL 游标和存储过程5.     PostgreSQL 索引6.     PostgreSQL 视图7.     PostgreSQL 触发器8.     PostgreSQL 角色、备份和还原9.     PostgreSQL 表空间管理

56,687

社区成员

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

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