首页 > 数据库 > PostgreSQL中的序列名很长很长怎么办

PostgreSQL中的序列名很长很长怎么办

时间:2023-05-13 15:01:41浏览次数:51  
标签:test1 PostgreSQL 很长 seq text col2 表名 序列

              PostgreSQL中的序列名很长很长怎么办

原创 SeanHe 数据库杂记 2023-05-06 06:01 发表于上海

PostgreSQL中的序列名很长很长怎么办

tag: PostgreSQL, 数据库移植

1.前言

我们回忆一下,PostgreSQL好像有对象名不超过63个字符的默认限制。详见: current/limit.html

 

而序列名可能是由系统自动生成的那种。比如一个表定义了某一列是serial之类的,它会隐含创建一个sequence。

我们来通过简单的实例看看这是啥样的情形?本能的,你可能以为,如果表名很长,序列名是不是超长了?

2.实际验证

2.1 正常的示例:

 1postgres=# create table test(id bigserial, col2 text);
2CREATE TABLE
3postgres=# \d+ test
4                                                       Table "public.test"
5 Column |  Type  | Collation | Nullable |             Default              | Storage  | Compression | Stats target | Description
6--------+--------+-----------+----------+----------------------------------+----------+-------------+--------------+-------------
7 id     | bigint |           | not null | nextval('test_id_seq'::regclass) | plain    |             |              |
8 col2   | text   |           |          |                                  | extended |             |              |
9Access method: heap
10
11postgres=# \d+ test_id_seq
12                        Sequence "public.test_id_seq"
13  Type  | Start | Minimum |       Maximum       | Increment | Cycles? | Cache
14--------+-------+---------+---------------------+-----------+---------+-------
15 bigint |     1 |       1 | 9223372036854775807 |         1 | no      |     1
16Owned by: public.test.id

在这个例子中,我们建了一个普通的表test,列: id是一个8位序列类型,这样系统会为表test自动生成序列:test_id_seq,它的名字不过就是11。是<表名>_<列名>_seq,也就是len(序列名) = len(表名) + len(seq列名)+5

这种情况发生在后者加起来不超过63的情况。

接下来,我们构造一两个边界的例子看看是什么样子的。

2.2 列名很长

建了下面这张表,让序列对应的列名长为63.

 1postgres=# create table test1(col123456789012345678901234567890123456789012345678901234567890 bigserial, col2 text);
2CREATE TABLE
3postgres=# \d+ test1
4                                                                                                             Table "public.test1"
5                             Column                              |  Type  | Collation | Nullable |
6 Default                                        | Storage  | Compression | Stats target | Description
7-----------------------------------------------------------------+--------+-----------+----------+--------------------------------------
8------------------------------------------------+----------+-------------+--------------+-------------
9 col123456789012345678901234567890123456789012345678901234567890 | bigint |           | not null | nextval('test1_col1234567890123456789
100123456789012345678901234567890_seq'::regclass) | plain    |             |              |
11 col2                                                            | text   |           |          |
12                                                | extended |             |              |
13Access method: heap

我们能看到,生成的序列名为:test1_col12345678901234567890123456789012345678901234567890_seq,总长也是63。

 

将列名最末字符换成1,结果就是:

 1postgres=# create table test1(col123456789012345678901234567890123456789012345678901234567891 bigserial, col2 text);
2CREATE TABLE
3postgres=# \d+ test1
4                                                                                                             Table "public.test1"
5                             Column                              |  Type  | Collation | Nullable |
6 Default                                        | Storage  | Compression | Stats target | Description
7-----------------------------------------------------------------+--------+-----------+----------+--------------------------------------
8------------------------------------------------+----------+-------------+--------------+-------------
9 col123456789012345678901234567890123456789012345678901234567891 | bigint |           | not null | nextval('test1_col1234567890123456789
100123456789012345678901234567890_seq'::regclass) | plain    |             |              |
11 col2                                                            | text   |           |          |
12                                                | extended |             |              |
13Access method: heap

生成的序列名为:test1_col12345678901234567890123456789012345678901234567890_seq,总长也是63。

名字与前边那个是一样的,对比一下看下图:

 

反向推理:它是把 {表名_截短后的列名_seq}构造成新的序列名。截短的原则是,从最末尾的子串进行截短。超长的部分都截掉。

2.3 表名很长

我们再看看如下示例,表名长度为63:tab123456789012345678901234567890123456789012345678901234567890

生成的序列名为:tab1234567890123456789012345678901234567890123_id1234567890_seq, 长度仍然为63.

 1postgres=# create table tab123456789012345678901234567890123456789012345678901234567890(id1234567890 bigserial, col2 text);
2CREATE TABLE
3postgres=# \d+ tab123456789012345678901234567890123456789012345678901234567890
4                                                      Table "public.tab123456789012345678901234567890123456789012345678901234567890"
5    Column    |  Type  | Collation | Nullable |                                       Default                                        | S
6torage  | Compression | Stats target | Description
7--------------+--------+-----------+----------+--------------------------------------------------------------------------------------+--
8--------+-------------+--------------+-------------
9 id1234567890 | bigint |           | not null | nextval('tab1234567890123456789012345678901234567890123_id1234567890_seq'::regclass) | p
10lain    |             |              |
11 col2         | text   |           |          |                                                                                      | e
12xtended |             |              |
13Access method: heap

对比一下这两个名字:

看起来,生成的名字是:{截短后表名_列名_seq}。如果是这样,依据这个,构造一个不同的表名,看看是什么样的?

比如表名是:tab123456789012345678901234567890123456789012345678901234567891,即最末一个字符不同。我们看看:

 1postgres=# create table tab123456789012345678901234567890123456789012345678901234567891(id1234567890 bigserial, col2 text);
2CREATE TABLE
3postgres=# \d+ tab123456789012345678901234567890123456789012345678901234567891
4                                                      Table "public.tab123456789012345678901234567890123456789012345678901234567891"
5    Column    |  Type  | Collation | Nullable |                                       Default                                        | S
6torage  | Compression | Stats target | Description
7--------------+--------+-----------+----------+--------------------------------------------------------------------------------------+--
8--------+-------------+--------------+-------------
9 id1234567890 | bigint |           | not null | nextval('tab123456789012345678901234567890123456789012_id1234567890_seq1'::regclass) | p
10lain    |             |              |
11 col2         | text   |           |          |                                                                                      | e
12xtended |             |              |
13Access method: heap

在这个我们想像的”反例“中,

表名:
tab123456789012345678901234567890123456789012345678901234567891

序列名:
tab123456789012345678901234567890123456789012_id1234567890_seq1

与上边的示例四个名字对比一下:

 

 

反推一下,情况也明了了,当它发现序列名可能重复时,会在seq后边加上计数器,然后前边的截断重新调整一下就实现了唯一性。这个算法看来不错。

2.4 表名和列名都很长

我们一步到位。表名:
tab123456789012345678901234567890123456789012345678901234567892  长度:63

序列列名:
col123456789012345678901234567890123456789012345678901234567890 长度:63

两者都很长。

 1postgres=# create table tab123456789012345678901234567890123456789012345678901234567892(col123456789012345678901234567890123456789012345678901234567890 bigserial, col2 text);
2CREATE TABLE
3postgres=# \d+ tab123456789012345678901234567890123456789012345678901234567892
4                                                                                Table "public.tab123456789012345678901234567890123456789
5012345678901234567892"
6                             Column                              |  Type  | Collation | Nullable |
7 Default                                        | Storage  | Compression | Stats target | Description
8-----------------------------------------------------------------+--------+-----------+----------+--------------------------------------
9------------------------------------------------+----------+-------------+--------------+-------------
10 col123456789012345678901234567890123456789012345678901234567890 | bigint |           | not null | nextval('tab12345678901234567890123456_col12345678901234567890123456_seq'::regclass) | plain    |             |              |
11 col2                                                            | text   |           |          |
12                                                | extended |             |              |
13Access method: heap

我们看看生成的序列名:tab12345678901234567890123456_col12345678901234567890123456_seq  长度:63

1表名:tab123456789012345678901234567890123456789012345678901234567892
2列表:col123456789012345678901234567890123456789012345678901234567890 
3序列:tab12345678901234567890123456_col12345678901234567890123456_seq

 

从现象上看,它从表名中拿了30个字符,从列名中拿了前30个字符。这个应该也有一定的选择性算法。

如果我们把上边的表名调整一下,末位改为1. 得到的是下边的结果:

 1postgres=# create table tab123456789012345678901234567890123456789012345678901234567891(col123456789012345678901234567890123456789012345678901234567890 bigserial, col2 text)
2;
3CREATE TABLE
4postgres=# \d+ tab123456789012345678901234567890123456789012345678901234567891
5                                                                                Table "public.tab123456789012345678901234567890123456789
6012345678901234567891"
7                             Column                              |  Type  | Collation | Nullable |
8 Default                                        | Storage  | Compression | Stats target | Description
9-----------------------------------------------------------------+--------+-----------+----------+--------------------------------------
10------------------------------------------------+----------+-------------+--------------+-------------
11 col123456789012345678901234567890123456789012345678901234567890 | bigint |           | not null | nextval('tab12345678901234567890123456_col1234567890123456789012345_seq1'::regclass) | plain    |             |              |
12 col2                                                            | text   |           |          |
13                                                | extended |             |              |
14Access method: heap
1表名:tab123456789012345678901234567890123456789012345678901234567891
2列表:col123456789012345678901234567890123456789012345678901234567890 
3序列:tab12345678901234567890123456_col1234567890123456789012345_seq1

 


作为对比,我们发现,它这里仍然以”去重“为思想,然后从总的表名列名全并串里头重新截短。真是妙。

至此,全部验证结束。我们可以大胆放心的使用了。

小结:

PostgreSQL中的对象名长度限制,针对序列类型的序列对象名的自动生成,还是比较巧妙的。我们也不用担心超长的问题。它会根据表名以及对应的列名,有规律的生成序列名。在认为有重复的时候,后缀可能就是_seq1, _seq2。

所以,放心大胆的用吧。只要表名列名都不超长即可。

标签:test1,PostgreSQL,很长,seq,text,col2,表名,序列
From: https://www.cnblogs.com/chuangsi/p/17397402.html

相关文章

  • MongoDB 功能详解之时间序列集合(Time Series Collections)
    MongoDB功能详解之时间序列集合(TimeSeriesCollections)      时间序列集合(TimeSeriesCollections):MongoDB5.0版本中的新功能。时间序列数据是一系列数据点,通过分析这些随时间变化的数据点而获得对数据的深刻理解。时间序列数据通常由以下组成部分组成:时间:数......
  • 「模板」最长不下降子序列 LIS
    最长不下降子序列LIS在一个数字序列中,找到一个最长的子序列(可以不连续),使得这个子序列是不下降(非递减)的。例如,现有序列A={1,2,3,-1,-2,7,9}(下标从1开始),它的最长不下降子序列是{1,2,3,7,9},长度为5。另外,还有一些子序列是不下降子序列,比如{1,2,3},{-2,7,9}等,但都不是最长的......
  • PostgreSQL插件(1): pg_timeout及pg_timetable 及 若干FAQ(1)
           PostgreSQL插件(1):pg_timeout及pg_timetable及若干FAQ(1)PostgreSQL2023-05-1209:20发表于河北编者荐语:报考PG数据库专家上盘古云课堂以下文章来源于数据库杂记,作者SeanHe1、前言这次将简单介绍PG的两个插件,以及若干常见问题汇集,作......
  • Python 输出简单彩色字符【ANSI 转义序列笔记】
    """ASCII码的0-31和127被称为C0控制字符例如\07就是BEL,响铃(\0表示八进制)其中\033(十进制27,十六进制x1B)是ESC,转义字符,它可以用于转义序列如\033[表示序列导入(ControlSequenceIntroducer),简写为CSI也可写作\x1b[两个字......
  • 记录一次金仓V8R3数据库坏块处理过程、PostgreSQL数据库适用
    因数广政务云华为业务存储固件升级,导致数据库产生坏块,业务SQL查询报错如下:ERROR:missingchunknumber0fortoastvalue38166585inSYS_TOAST_30170CONTEXT:PL/SQLfunctioninline_code_blockline12atFORoverEXECUTEstatement解决办法:1、先查询出SYS_TOAST......
  • Json序列化对象后,使用Lombok后属性xAxis大写变成小写xaxis解决方法
    一、问题描述最近在开发后端接口时,发现返回结构中,一个字段大小写转化有问题。lombok版本:1.18.14VO对象如下,字段为echarts趋势图组件。预期返回xAxis,实际返回xaxis@DatapublicclassULineBarVO{/***X轴信息*/privateULineBarDataVOxAxis;/*......
  • 子串 or 子序列
    定义:子串:必须连续子序列:可以不连续对比的回文序列和子串问题可以发现:如果是子串问题的话,涉及到子串问题的题目都有一个清0和记录最大值的过程,如果是子序列问题的话就不需要了。子串or子序列......
  • PostgreSQL 10 文档: PostgreSQL 客户端工具
    PostgreSQL客户端应用这部份包含PostgreSQL客户端应用和工具的参考信息。不是所有这些命令都是通用工具,某些需要特殊权限。这些应用的共同特征是它们可以被运行在任何主机上,而不管数据库服务器在哪里。当在命令行上指定用户和数据库名时,它们的大小写会被保留—空格或特殊字......
  • python导出postgresql中的一个表到本地csv表格
     代码如下修改xxx即可:conn=psycopg2.connect(host=DB_SERVICES,user=DB_USERNAME,password=DB_PWD,database=DB_NAME)cur=conn.cursor(cursor_factory=psycopg2.extras.DictCursor)sql=f"select*fromxxx.xxx"cur.execute(sql)res=cur.fetchall()pand......
  • 【题解】P4331 [BalticOI 2004]Sequence 数字序列
    以各种方式出现被玩烂的题目,算是小trick题?cpeditor意外地好用思路可并堆。平行时空同位体:CF13CP4331P4597CF713CP2893已知做法:\(O(n^2)\)dp:令\(f[i][j]\)为前\(i\)个数不超过\(j\)的最小代价优化:使用堆维护dp产生的折线(P4597题解区)\(O(n\logn......