serial
не е действителен тип данни. Ръководството гласи:
Типовете данни
smallserial
,serial
иbigserial
не са истински типове, а просто нотационно удобство за създаване на колони с уникални идентификатори
Псевдо типът данни се разрешава, като прави всичко това:
-
създайте последователност с име
tablename_colname_seq
-
създайте колоната с тип
integer
(илиint2
/int8
съответно заsmallserial
/bigserial
) -
направете колоната
NOT NULL DEFAULT nextval('tablename_colname_seq')
-
накарайте колоната да притежава последователността, така че да бъде изхвърлена с нея автоматично
Системата не знайте дали сте направили всичко това на ръка или чрез псевдо тип данни serial
. pgAdmin проверява изброените функции и ако всички са изпълнени, обратно проектираният DDL скрипт се опрости със съответстващия serial
Тип. Ако една от характеристиките не е изпълнена, това опростяване не се извършва. Това е нещо, което 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.