发布时间: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.
mongodb(开源数据库软件)下载 v4.0.3官方免费版
219M
powerdesigner(数据库设计工具)v16.5 最新版
615.07MB
3dmax UV贴图修改插件PolyUnwrapper v4.2.9 免费版
1.8M
activesync(电脑数据同步工具) v6.1 免费版
22.72MB
ce修改器下载
22.2M
ce修改器下载
22.3M
easyrecovery pro(硬盘数据恢复工具) v14.0.0.4 免费版
78.6M
easyrecovery pro(硬盘数据恢复工具) v14.0.0.4 官方版
87.8M
pdf修改器(PDF文件编辑软件) V2.5 免费版
3.26MB
vistalizator(电脑语言修改工具) 2.4 绿色版
1.03MB
手机管理软件(手机数据传输管理工具) v5.1.3.317最新免费版
24.5M
Glary Registry Repair(注册表修复工具) v5.0.1.102 注册版
5.33M
SpreadJS(电子表格控件) v13.1.4 中文版
276.5M
Think Cell(图表制作工具) v6.0 免费版
25.4M
分区表修复工具下载
19KB
注册表优化工具RegHunter v2.0.586 免费版
3.24M
注册表搜索工具
6.3M
FreeMind思维导图 1.0.1
27.35 MB
3dsmax下载
3.82G
Auslogics Registry Cleaner Pro下载
15.11MB
2020-05-01
如何知道游戏是否兼容Windows 8系统
mybatis
PC-cillin 2007如何设置升级代理服务器
地下城与勇士游戏卡如何设置
Horizon27 特色软件Aura下图片、视频和音乐使用说明
CentOS 7编译安装及yum安装Python 3
Ubuntu下迁移通过apt安装的MySQL数据库文件目录
设计模式——适配器模式
联想笔记本恢复Windows 8系统提示:无法初始化电脑,缺少所需的驱动器分区