2020-07-12 17:35:08
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.
CentOS7安装配置PostgreSQL数据库服务器
06-20
PostgreSQL数据库主从流复制
06-14
CentOS使用mysqlbinlog恢复MySQL数据库
05-07
Percona Xtrabackup备份mysql大数据库(完整备份与增量备份)
03-15
Ubuntu下迁移通过apt安装的MySQL数据库文件目录
07-18
centos系统安装配置phpMyAdmin数据库管理工具
04-27
memcached数据库简单配置介绍
05-25
oracle数据库迁移到MySQL的三种方法
04-27
使用shell脚本结合innobackupex自动备份mysql innodb数据库
04-06
记录一次Zabbix-server由于磁盘空间不足迁移数据库的过程
07-19
通过mariadb二进制日志实现数据库增量备份
06-05
修改注册表扩大常用网站数量
06-14
如何修改开机自检的注册表
05-16
如何禁止软件修改Windows 7注册表
05-13
增加Linux最大打开文件数/文件描述符
05-24
Apache优化:修改最大并发连接数
05-01
CentOS 7 修改内核启动顺序
04-23
Ideapad Y650修改触控板默认设定值
04-20
Linux ar建立或修改备存文件命令详解
06-23
M7650DNF如何将扫描的图片保存为PDF文档,如何修改保存路径?
07-02
Valentina Studio (数据库管理工具) v10.5.3 免费版
43.06MB
下载oracle11g(数据库管理系统)v11.2.0.1.0 精简版
4.17GB
下载pl sql developer(Oracle数据库存储程序单元的开发软件)2021 免费版
25.2M
下载3dsMax默认打开方式修改器绿色版 v1.0
3.82G
下载ce修改器下载
22.3M
下载ce修改器(内存修改编辑工具)6.2
22.2M
下载easyrecovery pro(硬盘数据恢复工具) v14.0.0.4 免费版
78.6M
下载pdf修改器下载
3.26MB
下载wpe三件套(网络封包编辑软件) v3.0 冰枫修改
2.9M
下载硬盘保护卡克星(数据破解抹除工具) 1.2 免费版
0.11MB
下载顶尖数据恢复软件(电脑数据恢复工具) 6.30 破解版
7.5M
下载Auslogics Registry Defrag注册表分析及优化工具下载 v12.2.0.0免费版
13.7M
下载Glary Registry Repair(注册表修复工具) v5.0.1.102 注册版
5.33M
下载Think Cell(图表制作工具) v6.0 免费版
25.4M
下载分区表修复工具下载
19KB
下载快表软件 v5.4.7 官方免费版
235.16M
下载注册表清理工具下载
2.13MB
下载EasyRecovery 13 下载
12.99MB
下载EasyShu下载
42.7MB
下载HeidiSQL下载
10.1M
下载