Ответ 1
serial
не является фактическим типом данных. В руководстве четко указано:
Типы данных smallserial, serial и bigserial не являются истинными типами, а просто удобством для создания уникальных столбцов идентификаторов
Псевдо-тип данных разрешен, выполняя все это:
-
Создайте последовательность с именем
tablename_colname_seq
-
Создайте столбец с типом
integer
(илиint2
/int8
соответственно дляsmallserial
/bigserial
) -
Сделать столбец
NOT NULL DEFAULT nextval('tablename_colname_seq')
-
Сделайте столбец собственной последовательностью, чтобы он автоматически удалялся.
Система не знает, делали ли вы все это вручную или путем псевдо-типа данных serial
. pgAdmin проверяет перечисленные функции и, если все они выполнены, обратный инженерный DDL script упрощается с помощью соответствующего типа последовательного интерфейса. Если одна из функций не выполняется, это упрощение не выполняется. Это то, что делает pgAdmin. Для базовых таблиц каталога это все равно. Нет типа serial
как такового.
Я довольно уверен, что невозможно автоматически переименовать принадлежащие ему последовательности. Вы можете запустить
ALTER SEQUENCE ... RENAME TO ...
как и вы. Сама система не заботится о названии. В столбце DEFAULT
хранится OID
('foo_pkey_seq'::regclass
), вы можете изменить имя последовательности без нарушения этого - OID остается тоже самое. То же самое касается внешних ключей и аналогичных ссылок внутри базы данных.
Неявный индекс для первичного ключа привязан к имени ограничения PK, которое не изменится, если вы измените имя таблицы. В Postgres 9.2 или новее вы можете использовать
ALTER TABLE ... RENAME CONSTRAINT ..
чтобы исправить это тоже.
Также могут быть индексы, указанные в названии таблицы. Аналогичная процедура:
ALTER INDEX .. RENAME TO ..
У вас могут быть все виды неофициальных ссылок на имя таблицы. Система не может принудительно переименовать объекты, которые можно назвать чем угодно. И это все равно.
Конечно, вы не хотите делать недействительным код SQL, который ссылается на эти имена. Очевидно, что вы не хотите изменять имена, пока их ссылается на логику приложений. Обычно это не будет проблемой для имен индексов, последовательностей или ограничений, поскольку они обычно не упоминаются по имени.
Postgres также получает блокировку объектов перед их переименованием. Поэтому, если существует параллельная транзакция, которая имеет какой-либо замок для объектов, о которых идет речь, ваша операция RENAME
останавливается до тех пор, пока эти транзакции не совершают или откатываются.
Системные каталоги и OID
Схема базы данных хранится в таблицах системного каталога в системной схеме pg_catalog
. Все подробности в руководстве здесь. Если вы не знаете точно, что вы делаете, , вы не должны возиться с этими таблицами вообще. Один ложный ход, и вы можете разбить свою базу данных. Используйте команды DDL, которые предоставляет Postgres.
Для некоторых из наиболее важных таблиц Postgres предоставляет типы идентификаторов объектов и набирает броски, чтобы быстро получить имя для OID и наоборот. Как:
SELECT 'foo_pkey_seq'::regclass
Если имя схемы находится в search_path
, а имя таблицы уникально, это дает вам то же самое, что:
SELECT oid FROM pg_class WHERE relname = 'foo_pkey_seq';
Первичный ключ большинства таблиц каталога OID
и внутри, большинство ссылок используют OID.