postgresql 实现多表关联删除

t_aj_ajjbxx

t_aj_ajfbxx

t_xt_dwxx

两表关联,删除一张表中数据

delete from db_lx.t_aj_ajfbxx ajfb
USING db_lx.t_xt_dwxx dw
where dw.c_bh=ajfb.c_ssdw and dw.c_sfbh='65';

只有t_aj_ajfbxx 表中数据被删除

三表关联,删除一张表中数据

delete from db_lx.t_aj_ajjbxx ajjb
USING db_lx.t_aj_ajfbxx ajfb,db_lx.t_xt_dwxx dw
where ajjb.c_bh = ajfb.c_ajbh and ajfb.c_ssdw=dw.c_bh and dw.c_sfbh='65';

只有t_aj_ajjbxx 表中数据被删除

补充:PostgreSQL的级联删除(主键删除则外键数据记录同时删除)

背景描述:

最近的一个项目中,所涉及的数据库表之间有设置级联关系,即表legal_positionsinfo中的id是表legal_approval的外键。

现在有一个功能是根据id删除表legal_positionsinfo中的一条记录。

但是在程序调试删除时,报错如下:

update or delete on table "legal_positionsinfo" violates foreign key constraint "legal_approval_position_id_fkey" on table "legal_approval" DETAIL: Key (id)=(1) is still referenced from table "legal_approval".

主要是因为两表之间存在级联关系,主键记录删除则外键记录也应该同时删除。

解决办法:

这里使用的是强大的数据库管理和设计工具Navicat,需要在数据库中设置级联删除,即将NO ACTION 改为 CASCADE即可:

那外键设置中的CASCADE、NO ACTION、RESTRICT、SET NULL都代表着什么意思呢?区别是什么呢?

CASCADE:父表delete、update的时候,子表会delete、update掉关联记录;

SET NULL:父表delete、update的时候,子表会将关联记录的外键字段所在列设为null,所以注意在设计子表时外键不能设为not null;

RESTRICT:如果想要删除父表的记录时,而在子表中有关联该父表的记录,则不允许删除父表中的记录;

NO ACTION:同 RESTRICT,也是首先先检查外键;

SET DEFAULT:父表有变更时,子表将外键列设置成一个默认的值 但Innodb不能识别。

外键约束使用最多有两种情况:

1)父表更新时子表也更新,父表删除时如果子表有匹配的项,删除失败;

2)父表更新时子表也更新,父表删除时子表匹配的项也删除。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

(0)

相关推荐

  • postgresql 实现取出分组中最大的几条数据

    看代码吧~ WITH Name AS ( SELECT * FROM ( SELECT xzqdm, SUBSTRING (zldwdm, 1, 9) xzdm, COUNT (*) sl FROM sddltb_qc WHERE xzqdm IN ('130432', '210604') GROUP BY xzqdm, SUBSTRING (zldwdm, 1, 9) ) AS A ORDER BY xzqdm, xzdm, sl ) SELECT xzqdm, xzdm, sl FROM (

  • 安装python依赖包psycopg2来调用postgresql的操作

    1.先安装psycopg2的依赖组件 本案例的操作系统为linux red hat 在安装python依赖包psycopg之前,你必须需要先安装postgresql数据库的相关组件: postgresql-devel,postgresql,postgresql-libs这三个组件比较重要.另外,可选组件:postgresql-server 安装上述组件之前,可以用命令来查看你的系统现在是否已经安装了相关组件: [root@dthost27 ~]# rpm -qa | grep PostgreSQ

  • postgresql 两表关联更新操作

    我就废话不多说了,大家还是直接看代码吧~ UPDATE 要更新的表 SET 字段1 = cqt.字段1, 字段2 = cqt.字段2, FROM 数据来源表 cqt WHERE 要更新的表.bsm = cqt.bsm 补充:Postgresql 连表更新字段语法 update 下面这段sql本来目的是想更新条件下的数据,可是这段sql却更新了整个表的数据.sql如下: UPDATE tops_visa.visa_order SET op_audit_abort_pass_date = now()

  • PostgreSQL 设置允许访问IP的操作

    PostgreSQL安装后默认只能localhost:5432访问 检验方法: curl localhost:5432 # 访问成功提示 curl: (52) Empty reply from server curl 127.0.0.1:5432 # 访问不成功提示 curl: (7) Failed to connect to 172.17.201.227 port 5432: Connection refused 修改pg_hba.conf pg_hba.conf和postgresql.con

  • 解决postgreSql远程连接数据库超时的问题

    首先在cmd中ping 这个ip如果发现可以ping通就可以考虑是 远程数据库开启了防火墙.或者数据库设置该ip不能访问. 防火墙问题:可以考虑直接关闭防火墙,或者设置防火墙开放5432端口 然后到postgresql安装目录下data中修改pg_hba.conf文件,配置用户的访问权限,拉到底部 host all all 127.0.0.1/32 trust host all all 192.168.1.0/24 md5 #表示允许网段192.168.1.0上的所有主机使用所有合法的数据库用户

  • postgresql 实现查询某时间区间的所有日期案例

    核心sql如下: select daytime::date from generate_series( ('2017-06-01'),--查询开始日期(可根据需求调整) (select now()::date),--查询结束日期(可根据需求调整) '1 day'--间隔(可根据需求调整) ) s(daytime) 以上sql,得到结果为从6月1号到今天这个时间区间内的每天的日期,如下: 举例说明: 查询tableA所有time_period区间内的日期,time_period的数据格式为:201

  • postgresql 实现多表关联删除

    t_aj_ajjbxx t_aj_ajfbxx t_xt_dwxx 两表关联,删除一张表中数据 delete from db_lx.t_aj_ajfbxx ajfb USING db_lx.t_xt_dwxx dw where dw.c_bh=ajfb.c_ssdw and dw.c_sfbh='65'; 只有t_aj_ajfbxx 表中数据被删除 三表关联,删除一张表中数据 delete from db_lx.t_aj_ajjbxx ajjb USING db_lx.t_aj_ajfbxx a

  • PostgresSql 多表关联删除语句的操作

    最近用PostgresSql数据库进行多表关联删除的操作,在写sql语句的时候遇到了问题: DELETE s.* FROM student s,classroom c WHERE s.cid = c.id AND s.sid = 1 DELETE FROM student s,classroom c WHERE s.cid = c.id AND s.sid = 1 上面两种写法操作后提示报错,下面是PostgresSql数据库对多表关联操作的正确用法,多张表之间用USING连接: DELETE

  • Oracle中多表关联批量插入批量更新与批量删除操作

    该文章会分为三部分 1.多表关联批量插入 2.多表关联批量更新 3.多表关联批量删除 首先要明白一点,为什么会有批量这一个概念,无非就是数据太多了,在java端把数据查出来然后在按照100-300的批次进行更新太耗性能了,而且写出来的代码会非常的臃肿,所谓好的实现是用最少的,最精简的代码实现需求,代码越少,留给自己犯错误的机会更少. 还有一个知识点就是多表关联,对于查询肯定是可以多表关联的,其实对于除了查询之外也是可以进行多表关联过滤数据的,从而达到在Oracle中查到目标数据即可更新,从而规避

  • Zend Framework教程之Zend_Db_Table表关联实例详解

    本文实例讲述了Zend Framework中Zend_Db_Table表关联用法.分享给大家供大家参考,具体如下: 介绍: 在RDBMS中,表之间有着各种关系,有一多对应,多多对应等等. Zend框架提供了一些方法来方便我们实现这些关系. 定义关系: 下面是本文用的例子的关系定义: <?php class Accounts extends Zend_Db_Table_Abstract { protected $_name = 'accounts'; protected $_dependentTa

  • 解决Springboot项目启动后自动创建多表关联的数据库与表的方案

    熬夜写完,尚有不足,但仍在努力学习与总结中,而您的点赞与关注,是对我最大的鼓励! 在一些本地化项目开发当中,存在这样一种需求,即开发完成的项目,在第一次部署启动时,需能自行构建系统需要的数据库及其对应的数据库表. 若要解决这类需求,其实现在已有不少开源框架都能实现自动生成数据库表,如mybatis plus.spring JPA等,但您是否有想过,若要自行构建一套更为复杂的表结构时,这种开源框架是否也能满足呢,若满足不了话,又该如何才能实现呢? 我在前面写过一篇 Activiti工作流学习笔记(

  • Entity Framework Core关联删除

    目录 数据库关联删除行为 定义实体 Fluent API 配置关联实体 创建表结构 EF Core 关联实体删除行为 总结 DeleteBehavior.Cascade DeleteBehavior.SetNull DeleteBehavior.ClientSetNull DeleteBehavior.Restrict 关联删除通常是一个数据库术语,用于描述在删除行时允许自动触发删除关联行的特征:即当主表的数据行被删除时,自动将关联表中依赖的数据行进行删除,或者将外键更新为NULL或默认值. 数

  • MySQL详细讲解多表关联查询

    目录 数据库设计范式 外键 内连接 外连接 结语 数据库设计范式 目前数据库设计有五种范式 , 一般我们数据库只需要满足前三项即可 第一范式 : 确保每列保持原子性 什么是原子性? 意思就是不可再分的,例如下 联系方式有 QQ,微信 , 电话等等 , 显然此列不满足原子性, 如果是单独的QQ或者电话等,则只有一个, 满足第一范式 第二范式 : 要有主键,要求其他字段都依赖于主键 为什么主键这么重要? 我们可以这样理解, 如果把表当作一个队伍, 那么主键就是这个队伍的队旗 • 没有主键就没有唯一性

  • MySQL 超大表快速删除方式

    目录 MySQL 超大表快速删除 表创建一个硬链接 执行表删除 执行文件删除 MySQL快速清空大表数据 清空表数据的五种方式 清空表数据语法 MySQL 超大表快速删除 MySQL里面直接对大表执行drop table删除有可能导致MySQL Hang住,对业务造成影响.删除超大表的前提是该表是独立表空间,这样删除才有效. 表创建一个硬链接 # du -sh pay_bills.ibd  175G        pay_bills.ibd # 创建硬链接 # ln pay_bills.ibd

  • thinkphp中的多表关联查询的实例详解

    thinkphp中的多表关联查询的实例详解 在进行后端管理系统的编程的时候一般会使用框架来进行页面的快速搭建,我最近使用比较多的就是thinkphp框架,thinkphp框架的应用其实就是把前端和后端进行分割管理,前端用户登录查询系统放在thinkphp中的home文件夹中进行管理,后端管理系统放在thinkphp中的admin文件夹中进行管理.对了,在使用thinkphp框架的时候是是要用到mvc架构的,mvc架构就是model(数据模型).view(视图).controller(控制器)的结

  • SQL update 多表关联更新的实现代码

    实现多表更新,尤其是A表和A的子表B表数据更新,下面是例子 有A.B张表,其记录如下: A表 c1       c2 -------------- 1       a1 2       a2 3       a3 8       a8 B表 c1       c3 -------------- 1        b1 2        b1 3        b3 10      b10 A.c1与B.c1相等,用一条sql语句,实现A.c2的值更新为B.c3 -----------------

随机推荐