2020-8-3 PostgreSQL的高级语法 ‘这部分触发器有问题,待修改‘

最近几天忙着入职培训,估计这次笔记会断断续续。screw it, Just fuck!!!

PostgreSQL 约束

主要用于创建表格时(也可创建表之后修改),对表中的数据规则进行约束。如果在插入数据时违反了创建时设置的约束条件,那么此次行为将会强行终止。约束保证了数据库中数据的准确性和可靠性。
以下是PostgreSQL中常用的约束:

  • not null:不能存储为null值;
  • unique:确保某列的值都是唯一的;
  • primary key:主键,是not null 和unique 的结合,毕竟主键就是这么定义的;
  • foreign key:外键,可使得一个表匹配到另一个表;
  • check:保证列中的值符合一定的条件,比如大于0,check(salary > 0);
  • exclusion:排他约束,暂时不太懂。。。

接下来创建一个表格,用到以上约束:
create table company (
id int primary key not null,
name text not null,
age int not null unique;
address varchar(40),
salary real check(salary > 0) default 2000.0,
deptno int references dept(deptno) – foreign key
);
  删除约束
删除约束必须要知道约束的名称,如果不知道可用**\d + 表名**来查看约束。
在这里插入图片描述

PostgreSQL 连接(join)

用于将两个表或者多个表连接起来。有如下几种情况:

  • cross join:交叉连接,将多个表做广义笛卡尔积,慎用,因为连接的数据有可能很多都没有实际意义;
  • inner join:内连接,常用,相当于自然连接,按表之间的共同字段连接;
  • left outer join:左外连接,首先进行内连接,将左表不符合条件的数据加入内连接;
  • right outer join:右外连接,同理左外连接;
  • full outer join:全外连接,首先进行内连接,将左表和右表都不符合的数据加入内连接。
    以下为各个连接的实例:
  • select * from company cross join dept;
  • select * from company, dept; – 交叉连接
  • select * from company c inner join dept d on c.id = d.deptno;
  • select * from company c left outer join dept d on c.id = d.deptno;
  • select * from company c right outer join dept d on c.id = d.deptno;
  • select * from company c full outer join dept d on c.id = d.deptno;
PostgreSQL union操作符

union操作符用于合并两个或多个select语句的结果。但是用于合并的结果集必须满足:具有相同数量的列;对应列必须有相似的数据类型;列的顺序相同
在这里插入图片描述
select emp_id, name, dept from company c inner join dept d on c.id = d.deptno
union
select emp_id, name, dept from company left outer join dept d on c.id = d.deptno;
union 默认将重复的行去掉,如果使得连接后的结果允许有重复行,那么将union 换成union all即可。

PostgreSQL null值

null值代表着遗漏的,未知的数据,默认某列是可以存放null值的,但是我们在创建表时可以使用not null来强制字段始终包含值,当不向该行插入数据时,系统会强制停止本次操作。注意null值和0值不是等价的,任何数值和null值进行运算、比较得出的结果还是null。

PostgreSQL 别名

总得来说和Oracle命名别名的方法一样,同样可省略as

PostgreSQL 触发器trigger

触发器是一个与表相关联的、存储SQL语句的程序,每当一个特定的数据操作语句(insert, update, delete)在指定的表上发出时,数据库便会自动执行触发器中定义的语句。
触发器可在下面几种情况触发:

  • 在执行操作之前
  • 在执行操作之后
  • 更新操作

触发器的类型:

  • 语句级触发器:在指定的操作语句操作之前或之后执行一次,不管这条语句影响了多少行;
  • 行级触发器(for each row):触发语句作用的每一条记录都被触发,在行级触发器中使用old和new伪记录变量,识别值的状态。

语法:
create [or replace] trigger +触发器名
{before | after}
{delete | insert | update [of +列名]}
on 表名
[for each row [when(条件)]]
begin
语句模块
end +触发器名;
--[]表示可选,{}表示必选一

create or replace trigger insertptri
after insert on person
begin
  dbms_output.put_lines(‘一条记录被插入’)
end insertptri; – 创建一个触发器insertptri,当向peron表插入数据时会print(’一条记录被插入‘)

create or replace trigger valid_add_sal
before update of sal on myemp
  for each row
begin
  if :new.sal <= :old.sal then
    raise_application_error(-20002, ‘涨后的工资不能比涨前低’);
  end if;
end valid_add_sal; – 创建一个valid_add_sal触发器,当改变表myemp中sal的据时,若改后的数据不大于改前的数据,那么会报错误为’-20002’,并弹出 ‘涨后的工资不能比涨前低’。此语法参考了Oracel。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值