PostgreSQL数据库测试环境中有多张表没有添加主键约束,只有一个serial的自增字段。现在需要把那些没有主键的表都加上,serial类型的字段为id 。

首先是怎么找到PostgreSQL数据库中哪些表没有主键?我们看下pg_class这个表,里面有个relhaspkey字段,如果为t说明有主键,f即没有主键。例如下面这个sql 。

SELECT n.nspname AS "Schema",c.relname AS "Table Name",c.relhaspkey AS "Has PK" FROM pg_catalog.pg_class c JOIN pg_namespace n ON ( c.relnamespace = n.oid AND n.nspname NOT IN ('information_schema', 'pg_catalog') AND c.relkind='r' ) WHERE c.relhaspkey = 'f' ORDER BY c.relhaspkey, c.relname ;

然后就是对这些表增加主键约束。删除和添加主键的sql如下所示:

alter table server drop constraint server_pkey ; alter table server add primary key (id) ;

主键添加完成之后可以通过d查看。

zhangnq=# d server Table "public.server" Column | Type | Modifiers --------+---------------+------------------------------------------------------ id | integer | not null default nextval('server_int_seq'::regclass) ip | character(50) | Indexes: "server_pkey" PRIMARY KEY, btree (id)

最后就是把这个思路写到脚本里面,运行脚本批量添加。脚本里面把执行失败的表都放在error.log文件中。

脚本:

#!/bin/bash export PATH=/opt/PostgreSQL/93/bin:$PATH export PGDATA=/data/pgsql export PGHOME=/opt/PostgreSQL/93 export PGPORT=5432 dbname=$1 if [ ! $dbname ];then echo "Please enter the database name." exit 1 fi psql -c "dt" -d $dbname >/dev/null if [ $? -ne 0 ];then exit 1 fi error_log="error.log" echo "">$error_log sql=`cat << EOF SELECT n.nspname AS "Schema",c.relname AS "Table Name" FROM pg_catalog.pg_class c JOIN pg_namespace n ON ( c.relnamespace = n.oid AND n.nspname NOT IN ('information_schema', 'pg_catalog') AND c.relkind='r' ) WHERE c.relhaspkey = 'f' ORDER BY c.relhaspkey, c.relname ; EOF` schemas=`psql -t -A -c "$sql" -d $dbname |cut -d "|" -f 1` tables=`psql -t -A -c "$sql" -d $dbname |cut -d "|" -f 1` for res in `psql -t -A -c "$sql" -d $dbname` do schema=`echo $res|cut -d "|" -f 1` table=`echo $res|cut -d "|" -f 2` tablename=`echo "$schema.$table"` psql -e -c "alter table $tablename add primary key (id) " -d $dbname if [ $? -ne 0 ];then echo "$dbname : Add primary key to $tablename error." >>$error_log fi done

说下碰到的的问题,在测试的时候发现如果把主键drop掉之后pg_class.relhaspkey值还是为t,但是用d查看确实没有主键了。解决的办法是手动vacuum这个表,即vacuum server 。

zhangnq=# select relname,relhaspkey from pg_class where relname='server' ; relname | relhaspkey ---------+------------ server | t (1 row) zhangnq=# alter table server drop constraint server_pkey ; ALTER TABLE zhangnq=# select relname,relhaspkey from pg_class where relname='server' ; relname | relhaspkey ---------+------------ server | t (1 row) zhangnq=# vacuum server ; VACUUM zhangnq=# select relname,relhaspkey from pg_class where relname='server' ; relname | relhaspkey ---------+------------ server | f (1 row) zhangnq=# alter table server add primary key (id) ; ALTER TABLE zhangnq=# select relname,relhaspkey from pg_class where relname='server' ; relname | relhaspkey ---------+------------ server | t (1 row)

查看pg_class的说明后发现原来pg_class只有在状态由false变成ture的时候会自动修改。这么设计可以提高并发性。

Several of the Boolean flags in pg_class are maintained lazily: they are guaranteed to be true if that's the correct state, but may not be reset to false immediately when the condition is no longer true. For example, relhasindex is set by CREATE INDEX, but it is never cleared by DROP INDEX. Instead, VACUUM clears relhasindex if it finds the table has no indexes. This arrangement avoids race conditions and improves concurrency.

原文出处:sijitao -> http://www.sijitao.net/2026.html

postgre 主键_PostgreSQL数据库修改表增加主键相关推荐

  1. MPPDB数据库新建表增加分布键心酸史

    MPPDB小白,没有使用过MPPDB数据库的可能非常难找到MPPDB相关语法知识,建表语句都差不多,如下: CREATE TABLE table_name(colName1 varvhar,colNa ...

  2. MySQL修改表的主键字段

    MySQL修改表的主键字段 1. 命令 ALTER TABLE sleep_device_day_temp DROP PRIMARY KEY ,ADD PRIMARY KEY ( id );

  3. mysql中为表增加外键_如何在Excel 2013中为符号分配键盘快捷键

    mysql中为表增加外键 We've previously shown you how to add keyboard shortcuts to symbols in Word 2013 to mak ...

  4. 数据库建表需要外键约束?

    数据库建表需要外键约束吗? 数据库建表时一定要设置外键约束关系吗?

  5. mysql数据库怎么添加主键约束_mysql修改表时怎么添加主键约束?

    mysql中可以通过"ALTER TABLE 表名 ADD PRIMARY KEY(字段名);"语句在修改数据表时添加主键约束:当在修改表时要设置表中某个字段的主键约束时,要确保设 ...

  6. 如何增加mysql主键约束_mysql修改表时怎么添加主键约束?

    mysql中可以通过"ALTER TABLE 表名 ADD PRIMARY KEY(字段名);"语句在修改数据表时添加主键约束:当在修改表时要设置表中某个字段的主键约束时,要确保设 ...

  7. 2005数据库导入mysql没有主键_MSSQL2005数据库导入导出+带主键、自动增量、关系图、表架构等...

    MSSQL2005数据库导入导出+带主键.自动增量.关系图.表架构等 关键词:mssql2005.导入导出 1.在本地安装Mssql Server 2005 2.接着安装SQLServer2005_X ...

  8. 数据库——创建数据库+创建表与主键

    文章目录 一.创建数据库 1.创建默认数据库 2.创建指定参数位置数据库 3.添加NDF数据文件 二.创建表 三.创建主键 1.创建主键 2.对已创建的表进行主.外键设置 一.创建数据库 1.创建默认 ...

  9. navicat修改表的主键自增长报错

    这周自己在构思一个项目的表的设计,由于是第一次,所以走了很多弯路,也遇到了几个问题,这里暂时贴上来. 我用PowerDesign设计出一部分关联表的ER图之后,导出了sql文件之后用navicat导入 ...

最新文章

  1. Spring Cloud Config 集中式配置
  2. MongoDB中_id(ObjectId)生成
  3. linux 定时器中断 imx,NXP iMX8 存储性能测试
  4. vivadoRAM中初始化文件coe如何快速生成
  5. 深入学习SpringMVC以及学习总结
  6. 消息中间件--RabbitMQ --- 消费端限流 -- 非常重要
  7. c++ new delete
  8. WebSocket请求过程分析及实现Web聊天室
  9. 安全沙箱冲突:Loader.content:XX 不能访问 XX 可以通过调用 Security.allowDomain 来避免此冲突。...
  10. JDK,JRE,JVM的区别
  11. 设计模式(JAVA)——Facade模式
  12. .net core with 微服务 - 微服务架构图
  13. 修改下 URL 就能高速下载网盘资源和百度文库
  14. 笔记本电脑打开计算机里面会跳,笔记本电脑为什么闪屏_笔记本电脑闪屏的原因及处理方法...
  15. vue+websocket+nodejs创建聊天室- 创建群聊、加入群聊
  16. 解析Google地图的Search接口返回的f.txt文件数据(其他类似)
  17. Visual studio 2015(VS2015)的下载和安装,以及安装VS2015中的C++
  18. 如何使用OBS Virtualcam 和 Live2DViewEX 在视频会议中成为最靓的仔
  19. 结合电商项目谈设计模式
  20. 千锋Unity学习笔记

热门文章

  1. El表达式+jstl标签
  2. 移动端WEB开发之-响应式布局
  3. Struts,JSP和XML解析三个问题
  4. Vue--实现前后端完全分离
  5. 巨头引领、科技助力,医美市场开启“自医”行动
  6. iframe标签使用传递参数
  7. ts20芯片c语言例程,种基于C语言的DSP程序通用固化方法.PDF
  8. 一一七、react Hooks实现forceUpdate
  9. 智能车大赛电磁组------电感的测试
  10. win7 打开 计算机 慢,Win7系统浏览网页时打开很慢的解决方法