我有一个表,人为控制记录为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语言不能嵌套,实在是想不出来怎样实现了,各位帮忙想想,先谢谢了!!!

解决方案 »

  1.   

    postgresql的没搞过,楼主可以参考一下这个链接http://www.pgsqldb.org/pgsqldoc-8.1c/plpgsql-trigger.html#PLPGSQL-TRIGGER-EXAMPLE
      

  2.   

    其实实现过程我知道,就是函数不会写,plpgsql语言不能嵌套,而我想的需要if中套一层if,怎样能够实现这样一个逻辑呢???
    希望高手指点!!!
      

  3.   

    可以嵌套啊,plpgsql功能很全。
      

  4.   

    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;
      

  5.   


    这个可以这样写:IF 条件1 THEN
     ...
    ELSIF 条件2 THEN
     ...
    ELSIF 条件3 THEN
     ...
    END IF;
      

  6.   

    我上次看到一个帖子说不能够嵌套的,那我可以这样写吗?
    if 条件1 then
    ……;
    eles 
         if 条件2 then
         ……;
         end if;
         if 条件3 then
         ……;
         end if;
         if 条件4 then
         ……;
          end if;
          .
          .
          .
    end if;
      

  7.   

    晕,你看什么帖子说的?
    我看的是PostgreSQL文档哦,摘里面的相关内容如下,你参考下吧:35.7.2. 条件
    IF 语句让你可以根据某种条件执行命令。 PL/pgSQL有五种形式的IF: IF ... THENIF ... THEN ... ELSEIF ... THEN ... ELSE IFIF ... THEN ... ELSIF ... THEN ... ELSEIF ... 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 的别名。 
      

  8.   


    对楼主的两个小建议1. 网上到 PostgreSQL 的官网或者其它网站下载一个文档手册。 然后粗看一遍。
    2. 安装一个 PostgreSQL, 勇于实践,伟人说得好“实践是检验的标准”, 我把“唯一”两个字去掉了。
      

  9.   

    2. 安装一个 PostgreSQL, 勇于实践,伟人说得好“实践是检验的标准”, 我把“唯一”两个字去掉了
    ::)
      

  10.   

    实践如下。
    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=#