PostgreSQL: 序列无法删除一例

今天在开发环境上维护一个序列时,由于命名不规范,带来维护上的难度问题,简单的来看下今天遇到的问题。

遇到的问题

库中的一个奇特序列

1
2
3
4
5
6
7
8
9
10
11
[pg92@redhatB ~]$ psql francs francs
psql (9.2.1)
Type "help" for help.

francs=> \ds
List of relations
Schema | Name | Type | Owner
--------+---------------------------------+----------+--------
francs | seq_test_1 | sequence | francs
public | "public"."seq_log_op_logininfo" | sequence | francs
(2 rows)

备注:注意序列 “public”.”seq_log_op_logininfo”, 这个命名非常奇特,我们起初目标是将这个序列的 schema 转换成 francs。

尝试更改序列的 schema

1
2
3
francs=> alter schema "public"."seq_log_op_logininfo" set schema francs;
ERROR: syntax error at or near "."
LINE 1: alter schema "public"."seq_log_op_logininfo" set schema fran...

备注:遇到错误,接着往下看。

无法引用,也无法删除

1
2
3
4
5
francs=> \ds "public"."seq_log_op_logininfo"
No matching relations found.

francs=> drop sequence "public"."seq_log_op_logininfo";
ERROR: sequence "seq_log_op_logininfo" does not exist

备注:可见直接引用序列 “public”.”seq_log_op_logininfo” 是行不通的,这个问题困扰了我些许时间,因为我一直想通过 OID 删除它,快下班了,一时也想不到办法。后来在回家的路上,突然想到了一个非常简单的方法。

处理过程

dump DDL

1
[pg92@redhatB tf]$ pg_dump -h 127.0.0.1 -E UTF8 -s -v francs > francs.ddl

备注:导出 francs 库的表结构到文件 francs.ddl ,然后在文件 francs.ddl 看看这个序列到底是如何表示的。
2.2 在文件 francs.ddl 中,找到如下代码

1
2
3
4
5
6
7
8
CREATE SEQUENCE """public"".""seq_log_op_logininfo"""
START WITH 1600
INCREMENT BY 1
NO MINVALUE
MAXVALUE 99999999999999999
CACHE 20;

ALTER TABLE public."""public"".""seq_log_op_logininfo""" OWNER TO francs;

备注:原来这个序列需要这样引用: “””public””.””seq_log_op_logininfo”””

接着尝试:

1
2
3
4
5
6
francs=> \ds """public"".""seq_log_op_logininfo"""
List of relations
Schema | Name | Type | Owner
--------+---------------------------------+----------+--------
public | "public"."seq_log_op_logininfo" | sequence | francs
(1 row)

备注:终于可以查看这个序列了。

2.4 更改序列 schema

1
2
3
4
5
6
7
8
9
10
francs=> alter sequence """public"".""seq_log_op_logininfo""" set schema francs;
ALTER SEQUENCE

francs=> \ds
List of relations
Schema | Name | Type | Owner
--------+---------------------------------+----------+--------
francs | "public"."seq_log_op_logininfo" | sequence | francs
francs | seq_test_1 | sequence | francs
(2 rows)

删除序列

1
2
francs=> drop sequence """public"".""seq_log_op_logininfo""";
DROP SEQUENCE

备注:一切正常。

总结

这是开发环境上遇到的一个问题,至于这个序列如何生成的不得而知,但有一点是需要明白的,在 PostgreSQL 中创建对像时应尽量不使用双引号,这会带来管理上的难度。

最后推荐和张文升共同编写的《PostgreSQL实战》,本书基于PostgreSQL 10 编写,共18章,重点介绍SQL高级特性、并行查询、分区表、物理复制、逻辑复制、备份恢复、高可用、性能优化、PostGIS等,涵盖大量实战用例!

购买链接:https://item.jd.com/12405774.html

PostgreSQL实战
感谢支持!
0%