首页 > 数据库 >PostgreSQL学习笔记-4.基础知识:触发器、索引

PostgreSQL学习笔记-4.基础知识:触发器、索引

时间:2023-02-01 09:57:37浏览次数:44  
标签:触发器 PostgreSQL name CREATE 基础知识 索引 trigger COMPANY

PostgreSQL 触发器是数据库的回调函数,它会在指定的数据库事件发生时自动执行/调用。

下面是关于 PostgreSQL 触发器几个比较重要的点:

  • PostgreSQL 触发器可以在BEFORE、AFTER、INSTEAD OF 下面几种情况下触发:
    • 在执行操作之前(在检查约束并尝试插入、更新或删除之前)。
    • 在执行操作之后(在检查约束并插入、更新或删除完成之后)。
    • 更新操作(在对一个视图进行插入、更新、删除时)。
  • 触发器的 FOR EACH ROW 属性是可选的,如果选中,当操作修改时每行调用一次;相反,选中 FOR EACH STATEMENT,不管修改了多少行,每个语句标记的触发器执行一次。
  • WHEN 子句和触发器操作在引用 NEW.column-name 和 OLD.column-name 表单插入、删除或更新时可以访问每一行元素。其中 column-name 是与触发器关联的表中的列的名称。
  • 如果存在 WHEN 子句,PostgreSQL 语句只会执行 WHEN 子句成立的那一行,如果没有 WHEN 子句,PostgreSQL 语句会在每一行执行。
  • BEFORE 或 AFTER 关键字决定何时执行触发器动作,决定是在关联行的插入、修改或删除之前或者之后执行触发器动作。
  • 要修改的表必须存在于同一数据库中,作为触发器被附加的表或视图,且必须只使用 tablename,而不是 database.tablename。
  • 当创建约束触发器时会指定约束选项。这与常规触发器相同,只是可以使用这种约束来调整触发器触发的时间。当约束触发器实现的约束被违反时,它将抛出异常。

语法

创建触发器时的基础语法如下:

CREATE  TRIGGER trigger_name [BEFORE|AFTER|INSTEAD OF] event_name
ON table_name
[
 -- 触发器逻辑....
];

在这里,event_name 可以是在所提到的表 table_name 上的 INSERT、DELETE 和 UPDATE 数据库操作。您可以在表名后选择指定 FOR EACH ROW。

以下是在 UPDATE 操作上在表的一个或多个指定列上创建触发器的语法:

CREATE  TRIGGER trigger_name [BEFORE|AFTER] UPDATE OF column_name
ON table_name
[
 -- 触发器逻辑....
];

实例

让我们假设一个情况,我们要为被插入到新创建的 COMPANY 表(如果已经存在,则删除重新创建)中的每一个记录保持审计试验:

shulanxtdb=# CREATE TABLE COMPANY(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT    NOT NULL,
   AGE            INT     NOT NULL,
   ADDRESS        CHAR(50),
   SALARY         REAL
);

为了保持审计试验,我们将创建一个名为 AUDIT 的新表。每当 COMPANY 表中有一个新的记录项时,日志消息将被插入其中:

shulanxtdb=# CREATE TABLE AUDIT(
   EMP_ID INT NOT NULL,
   ENTRY_DATE TEXT NOT NULL
);

在这里,ID 是 AUDIT 记录的 ID,EMP_ID 是来自 COMPANY 表的 ID,DATE 将保持 COMPANY 中记录被创建时的时间戳。所以,现在让我们在 COMPANY 表上创建一个触发器,如下所示:

shulanxtdb=# CREATE TRIGGER example_trigger AFTER INSERT ON COMPANY FOR EACH ROW EXECUTE PROCEDURE auditlogfunc();

auditlogfunc() 是 PostgreSQL 一个程序,其定义如下:

CREATE OR REPLACE FUNCTION auditlogfunc() RETURNS TRIGGER AS $example_table$
   BEGIN
      INSERT INTO AUDIT(EMP_ID, ENTRY_DATE) VALUES (new.ID, current_timestamp);
      RETURN NEW;
   END;
$example_table$ LANGUAGE plpgsql;

现在,我们开始往 COMPANY 表中插入数据:

shulanxtdb=# INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) VALUES (1, 'Paul', 32, 'California', 20000.00 );

这时,COMPANY 表中插入了一条记录:

同时, AUDIT 表中也插入了一条记录,因为我们在插入 COMPANY 表时创建了一个触发器。相似的,我们也可以根据需求在更新和删除时创建触发器:

emp_id |          entry_date
--------+-------------------------------
      1 | 2013-05-05 15:49:59.968+05:30
(1 row)

列出触发器

你可以把从 pg_trigger 表中把当前数据库所有触发器列举出来:

shulanxtdb=# SELECT * FROM pg_trigger;

如果,你想列举出特定表的触发器,语法如下:

shulanxtdb=# SELECT tgname FROM pg_trigger, pg_class WHERE tgrelid=pg_class.oid AND relname='company';

得到结果如下:

tgname
-----------------
 example_trigger
(1 row)

删除触发器

删除触发器基础语法如下:

drop trigger ${trigger_name} on ${table_of_trigger_dependent};

删除本文上表 company 上的触发器 example_trigger 的指令为:

drop trigger example_trigger on company;

PostgreSQL 索引

索引是加速搜索引擎检索数据的一种特殊表查询。简单地说,索引是一个指向表中数据的指针。一个数据库中的索引与一本书的索引目录是非常相似的。

拿汉语字典的目录页(索引)打比方,我们可以按拼音、笔画、偏旁部首等排序的目录(索引)快速查找到需要的字。

索引有助于加快 SELECT 查询和 WHERE 子句,但它会减慢使用 UPDATE 和 INSERT 语句时的数据输入。索引可以创建或删除,但不会影响数据。

使用 CREATE INDEX 语句创建索引,它允许命名索引,指定表及要索引的一列或多列,并指示索引是升序排列还是降序排列。

索引也可以是唯一的,与 UNIQUE 约束类似,在列上或列组合上防止重复条目。

CREATE INDEX 命令

CREATE INDEX (创建索引)的语法如下:

CREATE INDEX index_name ON table_name;

索引类型

单列索引

单列索引是一个只基于表的一个列上创建的索引,基本语法如下:

CREATE INDEX index_name
ON table_name (column_name);

组合索引

组合索引是基于表的多列上创建的索引,基本语法如下:

CREATE INDEX index_name
ON table_name (column1_name, column2_name);

不管是单列索引还是组合索引,该索引必须是在 WHEHE 子句的过滤条件中使用非常频繁的列。

如果只有一列被使用到,就选择单列索引,如果有多列就使用组合索引。

唯一索引

使用唯一索引不仅是为了性能,同时也为了数据的完整性。唯一索引不允许任何重复的值插入到表中。基本语法如下:

CREATE UNIQUE INDEX index_name
on table_name (column_name);

局部索引

局部索引 是在表的子集上构建的索引;子集由一个条件表达式上定义。索引只包含满足条件的行。基础语法如下:

CREATE INDEX index_name
on table_name (conditional_expression);

隐式索引

隐式索引 是在创建对象时,由数据库服务器自动创建的索引。索引自动创建为主键约束和唯一约束。
下面实例将在 COMPANY 表的 SALARY 列上创建索引:

# CREATE INDEX salary_index ON COMPANY (salary);

现在,用 \d company 命令列出 COMPANY 表的所有索引:

# \d company

得到的结果如下,company_pkey 是隐式索引 ,是表创建表时创建的:

# \d company
               数据表 "public.company"
  栏位   |     类型      | 校对规则 |  可空的  | 预设
---------+---------------+----------+----------+------
 id      | integer       |          | not null |
 name    | text          |          | not null |
 age     | integer       |          | not null |
 address | character(50) |          |          |
 salary  | real          |          |          |
索引:
    "company_pkey" PRIMARY KEY, btree (id)
触发器:
    example_trigger AFTER INSERT ON company FOR EACH ROW EXECUTE FUNCTION auditlogfunc()

你可以使用 \di 命令列出数据库中所有索引:

# \di
                         关联列表
 架构模式 |      名称       | 类型 |  拥有者  |   数据表
----------+-----------------+------+----------+------------
 public   | company_pkey    | 索引 | postgres | company
 public   | department_pkey | 索引 | postgres | department
(2 行记录)

DROP INDEX (删除索引)

一个索引可以使用 PostgreSQL 的 DROP 命令删除。

DROP INDEX index_name;

什么情况下要避免使用索引?

虽然索引的目的在于提高数据库的性能,但这里有几个情况需要避免使用索引。

使用索引时,需要考虑下列准则:

索引不应该使用在较小的表上。
索引不应该使用在有频繁的大批量的更新或插入操作的表上。
索引不应该使用在含有大量的 NULL 值的列上。
索引不应该使用在频繁操作的列上。

 

参考链接:https://www.shulanxt.com/database/postgresql/postgresql-create-trigger

标签:触发器,PostgreSQL,name,CREATE,基础知识,索引,trigger,COMPANY
From: https://www.cnblogs.com/mylive/p/17081550.html

相关文章

  • JS基础知识
    1.运算符   2.算数运算符  2.1算术运算符概述         2.2浮点数的精度问题        2.3判断是否能被整除    ......
  • 基础知识-语言进化史
    C语言——1972年诞生优势:贴近硬件,效率高劣势:指针和内存管理(运行暴露bug,浪费大量时间调试)非可移植性C+++——1982年诞生优势:面向对象,性能较好,兼容C劣势:特性复杂Java—......
  • Postgresql 使用Vscode开发指南
    Postgresql使用Vscode开发指南dependslibrariessudoaptinstall-ylibsystemd-devlibxml2-devlibssl-devlibicu-devzlib1g-devlibreadline-devpkg-config编......
  • PostgreSQL学习笔记-3.基础知识:CROSS、INNER、LEFT OUTER、RIGHT OUTER、FULL OUTER、
    PostgreSQLJOIN子句用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段。在PostgreSQL中,JOIN有五种连接类型:CROSSJOIN:交叉连接INNERJOIN:内连接LEFTOU......
  • PostgreSQL学习笔记-2.基础知识:INSERT、SELECT、运算符、表达式、约束
    PostgreSQLINSERTINTO语句用于向表中插入新记录,兼容SQL通用语法。语法INSERTINTO语句语法格式如下:INSERTINTOTABLE_NAME(column1,column2,column3,...column......
  • PostgreSQL学习笔记-1.基础知识:创建、删除数据库和表格
    PostgreSQL创建数据库PostgreSQL创建数据库可以用以下三种方式:1、使用CREATEDATABASESQL语句来创建。2、使用createdb命令来创建。3、使用pgAdmin工具。例如,我......
  • 第三天Java——基础知识
    创建项目1.先创建空项目Emptyproject2.再创建模板Module3.设置项目结构 4.创建Javaclass5.创建包一、注释注释颜色设置  Java中的注释有三种:1.单行注释......
  • Redis缓存基础知识(二)
    一、Redis缓存常见问题1.缓存穿透:指访问一个缓存和数据库中都不存在的key,由于这个key在缓存中不存在,则会到数据库中查询,数据库中也不存在该key,无法将数据添加到缓存中,所以......
  • PostgreSQL:查询数据表信息
    PostgreSQL14.0pgAdmin4Version5.7-- 0、序章要查询数据表信息,需要用到系统表或系统视图等,比如,pg_tables、pg_class、information_schema等。使用pgAdmin4......
  • 13.1 SQL Server触发器
    SQLServer触发器(Triggers)目录SQLServer触发器(Triggers)简介创建AFTER触发器(DML)简介SQLServerCREATETRIGGER语句触发器的“虚拟”表:INSERTED和DELETED创建触发器......