`

PostgreSQL环境下,触发器的创建

阅读更多

前言:

有时候我们向数据库表中插入数据时,需要在插入前保证数据的约束。有两种方法可以保证约束不被破坏,1、插入前手动检查数据,2、使用触发器。今天我们就用触发器来保证约束完整性。

 

假设有如下两个关系

课程编号(course_name) 上课教室(room) 课程时间(time)
English BO-101 AM
History BO-102 AM
Physics BO-103 PM
Biology BO-104 PM

                                   course关系

 

教师编号(id) 教授课程(course_name)
10001  History
10002  English
10003  Physics
10001  Biology

                                   teaches关系

现在要求实现约束“同一个教师不可能在同一时间在两个不同的教室上课”

 

这就要求我们每次向teaches关系中插入的数据,必须保证教师不会在同一时间,出现在两个不同的教室。转换成SQL语句就是

NOT EXISTS (
    SELECT id
    FROM teaches NATURAL JOIN course
    GROUP BY id, time
    HAVING COUNT(id) > 1);

 

创建触发器的SQL语句

CREATE TRIGGER example_trigger BEFORE INSERT ON teaches
FOR EACH ROW
EXECUTE PROCEDURE example_function();

 

example_function定义如下

CREATE FUNCTION example_function() 
    RETURNS TRIGGER
    LANGUAGE plpgsql
AS $fun_trigger$
    BEGIN
        IF EXISTS (
            SELECT id
            FROM (SELECT id, course_name FROM teaches UNION (SELECT NEW.id, NEW.course_name)) AS T NATURAL JOIN course
            GROUP BY id, time
            HAVING COUNT(id) > 1)
        THEN
            RAISE EXCEPTION 'CONSTRAINT ERROR: A teacher cannot be in two classrooms at the same time';
        END IF;
        RETURN NEW;
    END;
$fun_trigger$;

返回为TRIGGER(RETURNS TRIGGER)的存储过程中会自动创建一些变量

NEW:INSERT/UPDATE 操作新记录

OLD:DELETE/INSERT/UPDATE操作旧记录。更多的参数请参阅postgreSQL文档

 

course关系的数据:

SELECT course_name, room, time FROM course;


 

teaches关系的数据:

SELECT id, course_name FROM teaches;


 

插入一条有冲突的语句:

INSERT INTO teaches(id, course_name) VALUES('10003', 'Finance');


 

大功告成。

 

附注:

1.如果你需要在一个表(TABLE)更新(UPDATE)和插入(INSERT)时都触发触发器,SQL为

CREATE TRIGGER example_trigger BEFORE INSERT OR UPDATE ON teaches
FOR EACH ROW
EXECUTE PROCEDURE example_function();

 

2.如果你需要在一个表(TABLE)的指定列(COLUMN)更新时触发触发器,SQL为

CREATE TRIGGER example_trigger BEFORE UPDATE OF course_name ON teaches
FOR EACH ROW
EXECUTE PROCEDURE example_function();

 

3.如果你想用一个触发器(TRIGGER)作用在多个表上(TABLE),该怎么办呢?

CREATE TRIGGER example_trigger BEFORE INSERT ON teaches, course
FOR EACH ROW
EXECUTE PROCEDURE example_function();

 

不幸的是,这样的语法在postgreSQL中是不行的,你只能这样

CREATE TRIGGER example_trigger1 BEFORE INSERT ON teaches
FOR EACH ROW
EXECUTE PROCEDURE example_function();

CREATE TRIGGER example_trigger2 BEFORE INSERT ON course
FOR EACH ROW
EXECUTE PROCEDURE example_function();

参见点击查看详情

 

结束语:以上的SQL语句全部是在PostgreSQL(9.4.4)中运行通过,由于各种数据库的语法的差别,在其他数据库中并不能保证不会报错。由于本人水平所限,如有错误,欢迎批评指正。

 

参考文献:

1. 《数据库系统概念》第六版 5.3节 触发器

2. http://www.postgresql.org/docs/current/static/plpgsql-trigger.html

3. http://www.postgresql.org/docs/9.4/static/sql-createtrigger.html

4. http://www.tutorialspoint.com/postgresql/postgresql_triggers.htm

5. http://stackoverflow.com/questions/16102188/postgresql-insert-trigger-to-set-value

6. http://www.postgresql.org/message-id/17673.1129178350@sss.pgh.pa.us

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 大小: 9.2 KB
  • 大小: 9.1 KB
  • 大小: 17.6 KB
  • 大小: 20.1 KB
  • 大小: 10.7 KB
  • 大小: 13.4 KB
  • 大小: 25.2 KB
  • 大小: 10.1 KB
  • 大小: 14.9 KB
  • 大小: 14.2 KB
  • 大小: 5.6 KB
  • 大小: 32.7 KB
1
1
分享到:
评论

相关推荐

    postgres-deno:Deno的PostgreSQL扩展:在PostgreSQL函数和触发器中运行Typescript

    【postgres-deno】是一个专为...总结来说,postgres-deno是Deno开发者在PostgreSQL环境中实现高性能、类型安全数据库操作的有力工具,通过它,可以将现代Web开发的最佳实践带入数据库世界,提升开发效率和代码质量。

    postgresql

    PostgreSQL,通常简称为"pg",是...总的来说,"postgresql"包为Linux开发者提供了一个完整的PostgreSQL环境,涵盖了从数据库安装、配置到应用开发的所有必需元素,是构建基于PostgreSQL的可靠数据存储解决方案的基础。

    postgresql 离线安装教程

    PostgreSQL不仅支持大部分SQL标准,还提供了诸如复杂查询、外键、触发器、视图、事务完整性、多版本并发控制等现代特性。此外,用户还可以通过添加新的数据类型、函数、操作符、聚集函数、索引方法、过程语言等方式...

    postgresql-9.1.3-1-windows-x64

    1. **多版本并发控制(MVCC)**:PostgreSQL采用MVCC实现事务隔离,保证了读写操作的并发性,即使在高并发环境下也能提供一致的数据视图。 2. **全文搜索功能**:内建的Tsearch2模块支持对文本数据进行全文搜索,...

    PostgreSQL教程.pdf

    PostgreSQL是一个开源的对象关系数据库管理系统(ORDBMS),它为数据存储提供了安全可靠的环境,并支持最佳实践,允许在处理请求时检索数据。作为一款功能强大的数据库系统,PostgreSQL不依赖于任何公司或其他私人...

    Postgresql编程教程(自学).docx_postgresql_

    - **并发控制**:学习锁定机制和死锁避免策略,保证多用户环境下的数据一致性。 ### 6. PostgreSQL开发工具 - **客户端工具**:介绍pgAdmin、psql等常用的PostgreSQL管理工具。 - **编程接口**:了解如何通过各种...

    Oracle向PostgreSQL移植实例

    - 在Windows环境下,选择PostgreSQL 8.0.3的C本地化设置以避免编码问题。 - 数据库应初始化为SQL_ASCII编码,因为8.0.3版本不支持直接使用UNICODE初始化。 - 使用pgAdmin III作为管理工具,它会根据数据库编码...

    postgreSQL配置

    在本配置指南中,我们将详细介绍如何在Windows环境中安装和配置PostgreSQL,以及如何创建和管理GIS(地理信息系统)数据库。 首先,确保你已经安装了JDK 1.6,因为PostgreSQL的某些组件可能需要Java运行环境。接着...

    postgresql-cmd-12.0.zip

    总之,"postgresql-cmd-12.0.zip"提供了一套在Windows环境下通过命令行操作PostgreSQL 12.0的工具,这对于系统管理员、开发人员和数据库管理人员来说是非常有用的,特别是对于那些习惯于命令行操作或者需要自动化...

    postgresql-10.1.tar.gz

    在Linux环境下安装PostgreSQL 10.1是一个常见且重要的任务,这对于那些需要可靠数据库服务的项目来说至关重要。下面将详细介绍PostgreSQL在Linux上的安装过程及相关知识点。 首先,我们需要了解安装前的一些基本...

    PostgreSQL安装配置文档

    本节将详细介绍如何在Linux(Red Hat AS 4 Update 4)环境下安装PostgreSQL 8.2.5及相关的地理信息系统(GIS)组件PostGIS 1.3.1。此外,还将介绍如何安装与配置依赖库proj 4.5.0和geos 3.0.0rc4。 ##### 1. 安装...

    PostgreSQL数据库工程师培训实战教程(主从复制、高可用HA、集群架构)

    PostgreSQL支持标准的SQL语法,包括SELECT、INSERT、UPDATE、DELETE等语句,以及更高级的JOIN、视图、索引和触发器等特性。理解如何编写高效的SQL查询对于优化数据库性能至关重要。 5. **MySQL与PostgreSQL对比**:...

    PostgreSQL 9 从零开始学.pdf

    - 并发控制:理解多用户环境下如何处理并发访问,包括行级锁定和死锁检测。 - MVCC(多版本并发控制):PostgreSQL的并发控制机制,确保数据一致性。 通过深入学习“PostgreSQL 9 从零开始学”这本书,你可以逐步...

    postgresql-13.0.tar.gz

    7. **多版本并发控制**(MVCC):作为PostgreSQL的核心特性之一,MVCC在13.0版本中得到了优化,确保了在高并发环境下数据的一致性和隔离性。 安装“postgresql-13.0.tar.gz”压缩包时,你需要遵循以下步骤: 1. **...

    postgresql安装包

    3. **配置环境变量**:在安装前,可能需要将PostgreSQL的bin目录添加到系统的PATH环境变量中,以便于命令行调用。 4. **运行安装程序**:对于Windows,双击安装程序,按照向导指示进行;在Linux或Unix系统中,需要...

    postgresql-9.0.4-1-linux-x64.zip

    安装PostgreSQL 9.0.4时,用户需要考虑的事项包括系统兼容性、安装路径、初始化数据库集群、设置环境变量、创建数据库用户和角色,以及配置连接参数(如端口和监听地址)。在运行"postgresql-9.0.4-1-linux-x64.bin...

    PostgreSQL9.6.0-CN中文指南 PG DBA必备

    这包括设置环境变量、配置服务器参数、创建数据库集群和启动/停止服务等步骤。 三、数据类型与操作 PostgreSQL提供了丰富多样的数据类型,如整数、浮点数、字符串、日期时间、数组、JSON等。理解这些数据类型并熟练...

    在 Linux 上安装 PostgreSQL.docx

    了解在 Linux 上安装 PostgreSQL 的步骤和注意事项,包括下载和安装 PostgreSQL、创建对应的用户和组、配置环境变量、启动数据库引擎等。 在 Linux 上安装 PostgreSQL 需要注意安全考虑,不能以 root 用户运行,...

    POSTGRESQL7数据库开发指南

    通过深入学习和实践上述知识点,开发者可以熟练地在PostgreSQL7环境中进行数据库设计、开发和维护,为各种应用程序提供强大、可靠的数据支持。无论是在企业级应用还是小型项目中,PostgreSQL7都展现出了强大的功能和...

Global site tag (gtag.js) - Google Analytics