首页 > 数据库 >PostgreSQL教程:触发器

PostgreSQL教程:触发器

时间:2023-09-24 23:07:30浏览次数:40  
标签:触发器 PostgreSQL name -- 教程 score student id


触发器Trigger,是由事件触发的一种存储过程

当对标进行insert,update,delete,truncate操作时,会触发表的Trigger(看触发器的创建时指定的事件)

构建两张表,学生信息表,学生分数表。

在删除学生信息的同时,自动删除学生的分数。

先构建表信息,填充数据

create table student(
    id int,
    name varchar(32)
);
create table score(
    id int,
    student_id int,
    math_score numeric,
    english_score numeric,
    chinese_score numeric
);
insert into student (id,name) values (1,'张三');
insert into student (id,name) values (2,'李四');
insert into score (id,student_id,math_score,english_score,chinese_score) values(1,1,66,66,66);

insert into score (id,student_id,math_score,english_score,chinese_score)
values (2,2,55,55,55);

select * from student;
select * from score;

为了完成级联删除的操作,需要编写pl/sql。

先查看一下PGSQL支持的plsql,查看一下PGSQL的plsql语法

[ <<label>> ]
[ DECLARE
    declarations ]
BEGIN
    statements
END [ label ];

构建一个存储函数,测试一下plsql

-- 优先玩一下plsql
-- $$可以理解为是一种特殊的单引号,避免你在declare,begin,end中使用单引号时,出现问题,
-- 需要在编写后,在$$之后添加上当前内容的语言。
create function test() returns int as $$
declare
    money int := 10;
begin
    return money;
end;
$$ language plpgsql;

select test();

在简单了解了一下plpgsql的语法后,编写一个触发器函数。

触发器函数允许使用一些特殊变量

NEW
数据类型是RECORD;该变量为行级触发器中的INSERT/UPDATE操作保持新数据行。在语句级别的触发器以及DELETE操作,这个变量是null。

OLD
数据类型是RECORD;该变量为行级触发器中的UPDATE/DELETE操作保持新数据行。在语句级别的触发器以及INSERT操作,这个变量是null。

构建一个删除学生分数的触发器函数。

-- 构建一个删除学生分数的触发器函数。
create function trigger_function_delete_student_score() returns trigger as $$
begin
    delete from score where student_id = old.id;
    return old;
end;
$$ language plpgsql;

开始构建触发器,在学生信息表删除时,执行前面声明的触发器函数

PostgreSQL教程:触发器_postgresql

CREATE [ OR REPLACE ] [ CONSTRAINT ] TRIGGER name { BEFORE | AFTER | INSTEAD OF } { event [ OR ... ] }
    ON table_name
    [ FROM referenced_table_name ]
    [ NOT DEFERRABLE | [ DEFERRABLE ] [ INITIALLY IMMEDIATE | INITIALLY DEFERRED ] ]
    [ REFERENCING { { OLD | NEW } TABLE [ AS ] transition_relation_name } [ ... ] ]
    [ FOR [ EACH ] { ROW | STATEMENT } ]
    [ WHEN ( condition ) ]
    EXECUTE { FUNCTION | PROCEDURE } function_name ( arguments )

where event can be one of:

    INSERT
    UPDATE [ OF column_name [, ... ] ]
    DELETE
    TRUNCATE

CONSTRAINT选项被指定,这个命令会创建一个 约束触发器 。这和一个常规触发器相同,不过触发该触发器的时机可以使用SET CONSTRAINTS调整。约束触发器必须是表上的 AFTER ROW触发器。它们可以在导致触发器事件的语句末尾被引发或者在包含该语句的事务末尾被引发。在后一种情况中,它们被称作是被 延迟 。一个待处理的延迟触发器的引发也可以使用 SET CONSTRAINTS立即强制发生。当约束触发器实现的约束被违背时,约束触发器应该抛出一个异常。

描绘一波~~

-- 编写触发器,指定在删除某一行学生信息时,触发当前触发器,执行触发器函数
create trigger trigger_student 
after 
delete 
on student 
for each row 
execute function trigger_function_delete_student_score();
-- 测试效果
select * from student;
select * from score;
delete from student where id = 1;



标签:触发器,PostgreSQL,name,--,教程,score,student,id
From: https://blog.51cto.com/zhangxueliang/7589222

相关文章

  • PostgreSQL教程:约束(主键、非空、唯一、检查约束)
    核心在于构建表时,要指定上一些约束。约束主键--主键约束droptabletest;createtabletest(idbigserialprimarykey,namevarchar(32));非空--非空约束droptabletest;createtabletest(idbigserialprimarykey,namevarchar(32)notnull);......
  • PostgreSQL教程:数组类型
    数组还是要依赖其他类型,比如在设置住址,住址可能有多个住址,可以采用数组类型去修饰字符串。PGSQL中,指定数组的方式就是[],可以指定一维数组,也支持二维甚至更多维数组。构建数组的方式:droptabletest;createtabletest(idserial,col1int[],col2int[2],col3......
  • PostgreSQL教程:JSON&JSONB类型
    JSON在MySQL8.x中也做了支持,但是MySQL支持的不好,因为JSON类型做查询时,基本无法给JSON字段做索引。PGSQL支持JSON类型以及JSONB类型。JSON和JSONB的使用基本没区别。撇去JSON类型,本质上JSON格式就是一个字符串,比如MySQL5.7不支持JSON的情况的下,使用text也可以,但是字符串类型无法校验......
  • PostgreSQL教程:IP类型cidr
    PGSQL支持IP类型的存储,支持IPv4,IPv6这种,甚至Mac内种诡异类型也支持这种IP类型,可以在存储IP时,帮助做校验,其次也可以针对IP做范围查找。IP校验的效果IP也支持范围查找。......
  • PostgreSQL教程:枚举类型
    枚举类型MySQL也支持,只是没怎么用,PGSQL同样支持这种数据类型可以声明枚举类型作为表中的字段类型,这样可以无形的给表字段追加诡异的规范。--声明一个星期的枚举,值自然只有周一~周日。createtypeweekasenum('Mon','Tues','Sun');--声明一张表,表中的某个字段的类型是上面声......
  • PostgreSQL教程:日期类型
    在PGSQL中,核心的时间类型,就三个。timestamp(时间戳,覆盖年月日时分秒)date(年月日)time(时分秒)在PGSQL中,声明时间的方式。只需要使用字符串正常的编写yyyy-MM-ddHH:mm:ss就可以转换为时间类型。直接在字符串位置使用之前讲到的数据类型转换就可以了。当前系统时间:-可以使用now作为......
  • PostgreSQL教程:数值类型(整型、浮点型、序列、数值的常见操作)
    整型整型比较简单,主要就是三个:smallint、int2:2字节integer、int、int4:4字节bigint、int8:8字节正常没啥事就integer,如果要存主键,比如雪花算法,那就bigint。空间要节约,根据情况smallint浮点型浮点类型就关注2个(其实是一个)decimal(n,m):本质就是numeric,PGSQL会帮你转换numeric(n,m):PGSQL......
  • PostgreSQL教程:布尔类型
    布尔类型简单的丫批,可以存储三个值,true,false,null--布尔类型的约束没有那么强,true,false大小写随意,他会给你转,同时yes,no这种他也认识,但是需要转换selecttrue,false,'yes'::boolean,boolean'no',True,FaLse,NULL::boolean;boolean类型在做and和or的逻辑操作时,结果字段A字段Baand......
  • PostgreSQL教程:单引号和双引号的使用、数据类型转换
    单引号和双引号在PGSQL中,写SQL语句时,单引号用来标识实际的值。双引号用来标识一个关键字,比如表名,字段名。--单引号写具体的值,双引号类似MySQL的``标记,用来填充关键字--下面的葡萄牙会报错,因为葡萄牙不是关键字select1.414,'卡塔尔',"葡萄牙";数据类型转换第一种方式:只需要在值......
  • PostgreSQL教程:数据类型
    PGSQL支持的类型特别丰富,大多数的类型和MySQL都有对应的关系名称说明对比MySQL布尔类型boolean,标准的布尔类型,只能存储true,falseMySQL中虽然没有对应的boolean,但是有替换的类型,数值的tinyint类型,和PGSQL的boolean都是占1个字节。整型smallint(2字节),integer(4字节),bigint(8字节)跟MySQL没......