Postgresql 数据库大表没有主键在线增加
由于前期操作失误,导致 Postgresql 数据库部分表创建时未增加主键,记录处理过程;
查询数据库中没有创建主键的表
SELECT pg_class.relname,pg_constraint.conname AS pk_name
FROM pg_class left JOIN pg_constraint ON pg_constraint.conrelid = pg_class.oid AND pg_constraint.contype = 'p'
WHERE pg_class.relkind ='r' --r 表示是表
and pg_constraint.conname is null
order by pg_class.relname;
方法1、直接创建主键
只有一步:创建主键
ALTER TABLE 表名
ADD CONSTRAINT pk_表名 PRIMARY KEY (主键名);
说明:直接创建主键,方法简单,但是不适合大表,在线创建,大表会导致生产业务堵塞,系统停摆;
方法2、先创建索引,后创建主键
第一步:通过CONCURRENTLY选项创建唯一索引
CREATE UNIQUE INDEX CONCURRENTLY 索引名称 ON 表名(主键名)
第二步:通过UNIQUE索引创建主键
ALTER TABLE 表名
ADD CONSTRAINT pk_表名 PRIMARY KEY USING INDEX 索引名称
说明:
1、通过CONCURRENTLY选项创建唯一索引不会导致系统堵塞,通过UNIQUE索引创建主键速度很快;
2、通过CONCURRENTLY选项会出现失败,失败后索引会存在在系统中,需要手工删除重建