前言:
有时候我们向数据库表中插入数据时,需要在插入前保证数据的约束。有两种方法可以保证约束不被破坏,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
版权声明:本文为博主原创文章,未经博主允许不得转载。
相关推荐
【postgres-deno】是一个专为...总结来说,postgres-deno是Deno开发者在PostgreSQL环境中实现高性能、类型安全数据库操作的有力工具,通过它,可以将现代Web开发的最佳实践带入数据库世界,提升开发效率和代码质量。
PostgreSQL,通常简称为"pg",是...总的来说,"postgresql"包为Linux开发者提供了一个完整的PostgreSQL环境,涵盖了从数据库安装、配置到应用开发的所有必需元素,是构建基于PostgreSQL的可靠数据存储解决方案的基础。
PostgreSQL不仅支持大部分SQL标准,还提供了诸如复杂查询、外键、触发器、视图、事务完整性、多版本并发控制等现代特性。此外,用户还可以通过添加新的数据类型、函数、操作符、聚集函数、索引方法、过程语言等方式...
- 并发控制:理解多用户环境下如何处理并发访问,包括行级锁定和死锁检测。 - MVCC(多版本并发控制):PostgreSQL的并发控制机制,确保数据一致性。 通过深入学习“PostgreSQL 9 从零开始学”这本书,你可以逐步...
1. **多版本并发控制(MVCC)**:PostgreSQL采用MVCC实现事务隔离,保证了读写操作的并发性,即使在高并发环境下也能提供一致的数据视图。 2. **全文搜索功能**:内建的Tsearch2模块支持对文本数据进行全文搜索,...
PostgreSQL是一个开源的对象关系数据库管理系统(ORDBMS),它为数据存储提供了安全可靠的环境,并支持最佳实践,允许在处理请求时检索数据。作为一款功能强大的数据库系统,PostgreSQL不依赖于任何公司或其他私人...
- **并发控制**:学习锁定机制和死锁避免策略,保证多用户环境下的数据一致性。 ### 6. PostgreSQL开发工具 - **客户端工具**:介绍pgAdmin、psql等常用的PostgreSQL管理工具。 - **编程接口**:了解如何通过各种...
- 在Windows环境下,选择PostgreSQL 8.0.3的C本地化设置以避免编码问题。 - 数据库应初始化为SQL_ASCII编码,因为8.0.3版本不支持直接使用UNICODE初始化。 - 使用pgAdmin III作为管理工具,它会根据数据库编码...
在本配置指南中,我们将详细介绍如何在Windows环境中安装和配置PostgreSQL,以及如何创建和管理GIS(地理信息系统)数据库。 首先,确保你已经安装了JDK 1.6,因为PostgreSQL的某些组件可能需要Java运行环境。接着...
总之,"postgresql-cmd-12.0.zip"提供了一套在Windows环境下通过命令行操作PostgreSQL 12.0的工具,这对于系统管理员、开发人员和数据库管理人员来说是非常有用的,特别是对于那些习惯于命令行操作或者需要自动化...
在Linux环境下安装PostgreSQL 10.1是一个常见且重要的任务,这对于那些需要可靠数据库服务的项目来说至关重要。下面将详细介绍PostgreSQL在Linux上的安装过程及相关知识点。 首先,我们需要了解安装前的一些基本...
本节将详细介绍如何在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支持标准的SQL语法,包括SELECT、INSERT、UPDATE、DELETE等语句,以及更高级的JOIN、视图、索引和触发器等特性。理解如何编写高效的SQL查询对于优化数据库性能至关重要。 5. **MySQL与PostgreSQL对比**:...
这个压缩文件包含了安装PostgreSQL所需的所有组件,特别是"postgresql-11.5-1-windows-x64.exe",这是一个可执行文件,用于在Windows环境下进行安装。 PostgreSQL 11.5是该数据库系统的一个重要版本,引入了许多新...
3. **配置环境变量**:在安装前,可能需要将PostgreSQL的bin目录添加到系统的PATH环境变量中,以便于命令行调用。 4. **运行安装程序**:对于Windows,双击安装程序,按照向导指示进行;在Linux或Unix系统中,需要...
安装PostgreSQL 9.0.4时,用户需要考虑的事项包括系统兼容性、安装路径、初始化数据库集群、设置环境变量、创建数据库用户和角色,以及配置连接参数(如端口和监听地址)。在运行"postgresql-9.0.4-1-linux-x64.bin...
这包括设置环境变量、配置服务器参数、创建数据库集群和启动/停止服务等步骤。 三、数据类型与操作 PostgreSQL提供了丰富多样的数据类型,如整数、浮点数、字符串、日期时间、数组、JSON等。理解这些数据类型并熟练...
此外,还涵盖了事务处理、存储过程、触发器等内容。 **3. 索引与性能优化** PostgreSQL 9.6支持B-Tree、GiST、SP-GiST、GIN、BRIN等多种索引类型,以适应不同的查询模式。手册将指导用户如何创建、管理和使用索引来...
了解在 Linux 上安装 PostgreSQL 的步骤和注意事项,包括下载和安装 PostgreSQL、创建对应的用户和组、配置环境变量、启动数据库引擎等。 在 Linux 上安装 PostgreSQL 需要注意安全考虑,不能以 root 用户运行,...