对PostgreSQL的UPDATE和DELETE外键属性思考

外键创建时默认属性是MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION。这里需要深入思考一下NO ACTION这部分。

首先,该部分参数有三种:

1)NO ACTION - 不允许删除/更新,但是在事务中延迟报错。

2)RESTRICT - 不允许删除/更新,直接报错。

3)CASCADE - 允许级联删除/更新。

在这里,CASCADE最好理解,是级联的意思,如删除父表数据时子表关联数据也存在则会级联删除。

NO ACTION和RESTRICT对于操作都会进行检查,如果不符合约束则会报ERROR并退出,数据不变,唯一的区别是NO ACTION可以设置约束在事务中延迟生效,而RESTRICT不允许。个人理解应该是处于事务性能的考虑,假设在一个大事务中,定义的是RESTRICT,那么执行每一条语句都回去校验,如果整个事务中没有关联删除的错误存在,那必然会导致时间的浪费;但是如果此时使用NO ACTION,事务整个过程都在平滑处理,到最后提交时,如果存在级联约束,那么久报错退出,如果不存在久直接提交整个事务,此时是最省时的。另外事务具有原子性,针对一个事务做此处理也说的过去。

上一篇:Greenplum源码编译安装ORCA握手失败解决 - Caused by SSLError(SSLError("bad handshake: ...)


下一篇:psql: FATAL: the database system is in recovery mode - 问题定位方法与解决