Postgres在哪里存储表序列信息

时间:2018-12-19 18:12:40

标签: postgresql database-design rename

我在Postgres中有一个模型-比如Student-它具有主键id serial,这意味着还有另一个表student_id_seq可以跟踪学生的序列信息。

如果我将表student的名称更改为StudentYear,会不会有问题?我是否需要做任何事情以确保重命名表不会导致任何崩溃?

2 个答案:

答案 0 :(得分:2)

您可以根据需要重命名表或序列,所有内容将继续工作。

表列及其序列之间的关系存储在两个位置:

  1. pg_attrdef中,存储属性的默认值。
  2. pg_depend中,跟踪对象之间的依赖性。

所有对象和列在内部都由对象ID或属性号引用,因此重命名不是问题。

一个例子:

CREATE TABLE serialdemo (id serial);

SELECT oid FROM pg_class WHERE relname = 'serialdemo';

  oid  
-------
 69427
(1 row)

SELECT attnum FROM pg_attribute WHERE attrelid = 69427 AND attname = 'id';

 attnum 
--------
      1
(1 row)

从属对象:

SELECT classid::regclass, objid, deptype
FROM pg_depend
WHERE refobjid = 69427 AND refobjsubid = 1;

  classid   | objid | deptype 
------------+-------+---------
 pg_attrdef | 69430 | a
 pg_class   | 69425 | a
(2 rows)

列的默认定义是这些相关对象之一:

SELECT adbin, adsrc FROM pg_attrdef WHERE oid = 69430;

-[ RECORD 1 ]---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
adbin | {FUNCEXPR :funcid 480 :funcresulttype 23 :funcretset false :funcvariadic false :funcformat 2 :funccollid 0 :inputcollid 0 :args ({FUNCEXPR :funcid 1574 :funcresulttype 20 :funcretset false :funcvariadic false :funcformat 0 :funccollid 0 :inputcollid 0 :args ({CONST :consttype 2205 :consttypmod -1 :constcollid 0 :constlen 4 :constbyval true :constisnull false :location -1 :constvalue 4 [ 49 15 1 0 0 0 0 0 ]}) :location -1}) :location -1}
adsrc | nextval('serialdemo_id_seq'::regclass)

在这里,adsrc不在内部使用,仅用于人眼。 重命名序列后,此列将不会更改,尽管一切都会继续进行。

对该序列的相关引用是:constvalue 4 [ 49 15 1 0 0 0 0 0 ]。这是一个4字节的无符号整数,对象ID(1×256²+ 15×256 + 49 = 69425)。

另一个相关对象是序列:

SELECT relname, relkind FROM pg_class WHERE oid = 69425;

      relname      | relkind 
-------------------+---------
 serialdemo_id_seq | S
(1 row)

答案 1 :(得分:1)

  

如果将学生的表名更改为“ StudentYear”,会不会有问题?

不。与该序列相关的表的列。如果我没有以下错误:

nextval('student_id_seq'::regclass)

因此,您不必关心重命名表或列的情况。