Где Postgres хранит информацию о последовательности таблиц - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть модель в Postgres - скажем, Student - с первичным ключом id serial, что означает, что есть еще одна таблица student_id_seq, которая отслеживает информацию о последовательности для студента.

Если я изменюИмя таблицы от student до, скажем, StudentYear, будут ли проблемы?Должен ли я что-нибудь сделать, чтобы переименование таблицы не приводило к сбою?

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Вы можете переименовать таблицу или последовательность, как хотите, и все будет работать.

Связь между столбцом таблицы и ее последовательностью хранится в двух местах:

  1. В pg_attrdef, где хранятся значения атрибутов по умолчанию.
  2. В pg_depend, где отслеживаются зависимости между объектами.

Все объекты и столбцы имеют внутреннюю ссылку на ихИдентификаторы объектов или номера атрибутов, поэтому переименование чего-либо не является проблемой.

Пример:

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-байтовое целое число без знака, идентификатор объекта (1 × 256² + 15 × 256 + 49 = 69425).

Другим зависимым объектом является последовательность:

SELECT relname, relkind FROM pg_class WHERE oid = 69425;

      relname      | relkind 
-------------------+---------
 serialdemo_id_seq | S
(1 row)
0 голосов
/ 19 декабря 2018

если изменить имя таблицы ученика на «StudentYear», будут ли какие-либо проблемы?

Нет.Столбец таблицы связан с этой последовательностью.Если я не ошибаюсь, как указано ниже:

nextval('student_id_seq'::regclass)

Так что вам не нужно заботиться о переименовании таблиц или столбцов.

...