postgresql删除主键的操作

ALTER TABLE tablename DROP CONSTRAINT primaryname。

talbename:表示表名

primaryname:表示主键名

例子:

postgres=# \d c_tab;
     Table "public.c_tab"
 Column  |   Type    | Modifiers
---------------+-----------------------------+-----------
 uptime  | timestamp without time zone | not null
 temp   | integer      |
Indexes:
 "c_tab_pkey" PRIMARY KEY, btree (uptime)

上面的c_tab_pkey就是主键名。

postgres=# alter table c_tab drop constraint c_tab_pkey;
ALTER TABLE

补充: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 主备数据宕机恢复测试方案

    主节点宕机数据,备库数据恢复 背 景 在从节点停止服务,然后往主库不断写入数据,然后把主机宕机掉,启动从库,把主库宕机期间的增量wal日志复制到从库的archive目录下, 执行恢复脚本,则会把主机宕机后的增量数据追加到数据库. 环境 服务器 角色 10.10.56.16 master 10.10.56.18 slave - 配置16 master 的 pg_hba,conf 文件 host all all 10.10.56.0/0 md5 host replication all 10.10.

  • PostgreSQL使用MySQL外表的步骤详解(mysql_fdw)

    浅谈 postgres不知不觉已经升到了版本13,记得两年前还是版本10,当然这中间一直期望着哪天能在项目中使用postgresql,现在已实现哈-: 顺带说一下:使用postgresql的原因是它的生态完整,还有一个很重要的点儿是速度快这个在第10版的时 这么说也许还为时过早, 但是在13这一版本下一点儿也不为过,真的太快了,我简单的用500w的数据做聚合,在不建立索引(主键除外)的情况下 执行一个聚合操作,postgres 的速度是mysql的8倍,真的太快了-:好了,这一章节我就聊一聊我实

  • PostgreSQL LIST、RANGE 表分区的实现方案

    简 介 PG分区:就是把逻辑上的一个大表分割成物理上的几块. 分区的优点 1. 某些类型的查询性能得到提升 2. 更新的性能也可以得到提升,因为某块的索引要比在整个数据集上的索引要小. 3. 批量删除可以通过简单的删除某个分区来实现. 4. 可以将很少用的数据移动到便宜的.转速慢的存储介质上. 分区实现原理 10.x版本之前PG表分区的实现原理:PG中是通过表的继承来实现的,建立一个主表,里面是空的,然后每个分区去继承它.无论何时,该主表里面都必须是空的 官网建议:只有当表本身大小超过了机器物理

  • SpringBoot连接使用PostgreSql数据库的方法

    一.介绍 此次更新时间:2020-10-28,现在是上班时间,偷更一下.其实使用IDEA的话无需配置Maven什么的,如果你们公司不是强制要求使用Eclipse的话,只需要有个JDK的环境即可,IDEA自带了一个版本的Maven,还是挺新的,目前IDEA最新版2.2.3的版本.我们也不用按照下面这个步骤去下载Spring Initializr,我们在IDEA中新建项目选择到Maven就行了,干净简洁. 目前在Resources目录下的application大多数是使用yml语法了.现在已经太长时

  • 浅谈PostgreSQL的客户端认证pg_hba.conf

    大家都知道防火墙主要是用来过滤客户端并保护服务器不被恶意访问攻击,那在pg中同样存在一个类似于防火墙的工具用来控制客户端的访问,也就是pg_hba.conf这个东东. 在initdb初始化数据文件时,默认提供pg_hba.conf. 通过配置该文件,能够指定哪些ip可以访问,哪些ip不可以访问,以及访问的资源和认证方式,该文件类似于oracle中的监听中的白名单黑名单功能,且同样可以reload在线生效. 记录可以是下面七种格式之一: local database user auth-metho

  • PostgreSQL 逻辑复制 配置操作

    #### PostgreSQL Logical Replication (逻辑复制) #### Logical Replication (逻辑复制) 为PostgreSQL自己提供的一种方案,主要是通过一方 发布,一方订阅,来实现彼此共同关注的一种技术. 服务器 | 功能 | 10.10.56.16 | 发布者 P1_pub表 | | 10.10.56.17 | 发布者 P2_pub表 | | 10.10.56.19 | 订阅者 P_sub表 | 背 景 一些数据根据业务拆分成一部分P1表.一部

  • postgresql删除主键的操作

    ALTER TABLE tablename DROP CONSTRAINT primaryname. talbename:表示表名 primaryname:表示主键名 例子: postgres=# \d c_tab; Table "public.c_tab" Column | Type | Modifiers ---------------+-----------------------------+----------- uptime | timestamp without time

  • oracle删除主键查看主键约束及创建联合主键

    1,主键的删除 ALTER TABLE TABLENAME DROP PRIMARY_KEY 执行上面的SQL可以删除主键:如果不成功可以用 ALTER TABLE TABLENAME DROP CONSTRAINTS COLUMN CASCADE; --删除约束 ALTER TABLE TABLENAME DISABLE PRIMARY_COLUMN ; --设置被设置为主键的列为无效 DROP INDEX INDEX_NAME; --删除主键索引 2,查看主键约束 SELECT * FROM

  • oracle中添加删除主键的方法

    1.创建表的同时创建主键约束 (1)无命名 create table student ( studentid int primary key not null, studentname varchar(8), age int); (2)有命名 create table students ( studentid int , studentname varchar(8), age int, constraint yy primary key(studentid)); 2.删除表中已有的主键约束 (1

  • MySQL删除外键、增加外键以及删除主键、增加主键的实战步骤

    目录 一.MySQL删除外键 二.MySQL增加外键 三.MySQL删除主键 四.MySQL增加主键 补充:MySQL中有外键时数据表的删除方法 总结 一.MySQL删除外键 格式: alter table 表名 drop foreign key 外键名; 表名就是有外键存在的那个表. 外键名可以通过查看表的创建信息得到. 查看表的创建信息格式: show create table 表名; 二.MySQL增加外键 外键可以在修改表时添加,但是添加外键的前提是: 从表中外键列中的数据必须与主表中主

  • Mybatis批量插入返回插入成功后的主键id操作

    我们都知道Mybatis在插入单条数据的时候有两种方式返回自增主键: 1.对于支持生成自增主键的数据库:增加 useGenerateKeys和keyProperty ,<insert>标签属性. 2.不支持生成自增主键的数据库:使用<selectKey>. 但是怎么对批量插入数据返回自增主键的解决方式网上看到的还是比较少,至少百度的结果比较少. Mybatis官网资料提供如下: First, if your database supports auto-generated key

  • mysql 实现设置多个主键的操作

    user表,身份证号码要唯一,手机号码,邮箱要唯一 实现方式: 表结构不用动.一个主键Id 加索引实现 如图类型设置索引类型为Unique 唯一 选择栏位,命个名就行.索引方式btree 就好.ok啦~ 补充:mysql实现多表主键不重复 同一个数据库中有两张表,里面字段都是一样,只是因为存的数据要区分开.但是主键不能重复.具体实现如下: 新建数据库 mytest 新建user表和admin表 CREATE TABLE `user` ( `user_id` INT(11) NOT NULL, `

  • SQL语句删除和添加外键、主键的方法

    --删除外键 语法:alter table 表名 drop constraint 外键约束名 如: alter table Stu_PkFk_Sc drop constraint FK_s alter table Stu_PkFk_SC drop constraint FK_c --添加外键 语法:alter table 表名 add constraint 外键约束名 foreign key(列名) references 引用外键表(列名) 如: alter table Stu_PkFk_Sc

  • Redis中主键失效的原理及实现机制剖析

    作为一种定期清理无效数据的重要机制,主键失效存在于大多数缓存系统中,Redis 也不例外.在 Redis 提供的诸多命令中,EXPIRE.EXPIREAT.PEXPIRE.PEXPIREAT 以及 SETEX 和 PSETEX 均可以用来设置一条 Key-Value 对的失效时间,而一条 Key-Value 对一旦被关联了失效时间就会在到期后自动删除(或者说变得无法访问更为准确).可以说,主键失效这个概念还是比较容易理解的,但是在具体实现到 Redis 中又是如何呢?最近本博主就对 Redis

  • mybatisplus 复合主键(多主键) CRUD示例详解

    目录 mybatisplus复合主键CRUD 需求描述 mybatisplus-plus mybatisplus 复合主键CRUD 需求描述 最近接到个挺有意思的需求,做用户观看学习视频时长的一个数据埋点 储存用户观看视频时长.记录的接口的调用肯定会特别频繁,因为每间隔指定时间每个用户都会调用,如果在这个接口里直接操作数据库将会给我们的数据库带来一定的压力,在我的代码中是不允许的,而我是这样完成这个需求的: 首先将用户观看视频的时长.记录存储到阿里云的日志库里,随后以定时器从阿里云的日志库中拉取

  • MySQL 数据库 增删查改、克隆、外键 等操作总结

    目录 SQL 字段数据类型 查看数据库信息语句 SQL 语句 创建.删除 数据库 数据表 向表中添加.删除 记录.查询记录 修改表名,添加.修改.删除 字段,添加唯一约束 查看.删除.添加 表中的索引 扩展功能,字段值自增等 数据表高级操作 克隆表,将数据表的数据记录生成到新的表中 删除记录后主键记录重头开始自增 创建临时表 创建外键约束,保证数据的完整性和一致性 MySQL 六种约束 数据库中有数据表,数据表中有一条一条的记录. 可以用Navicat 等远程连接工具链接数据库,不过数据库需要开

随机推荐