我在Postgres中有一个模型-比如Student-它具有主键id serial
,这意味着还有另一个表student_id_seq
可以跟踪学生的序列信息。
如果我将表student
的名称更改为StudentYear
,会不会有问题?我是否需要做任何事情以确保重命名表不会导致任何崩溃?
答案 0 :(得分:2)
您可以根据需要重命名表或序列,所有内容将继续工作。
表列及其序列之间的关系存储在两个位置:
pg_attrdef
中,存储属性的默认值。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)
因此,您不必关心重命名表或列的情况。