serial
není skutečný datový typ. V návodu je uvedeno:
Datové typy
smallserial
,serial
abigserial
nejsou pravdivé typy, ale pouze zápisové pohodlí pro vytváření sloupců jedinečných identifikátorů
Pseudo datový typ je vyřešen tímto vším:
-
vytvořte sekvenci s názvem
tablename_colname_seq
-
vytvořte sloupec s typem
integer
(neboint2
/int8
respektive prosmallserial
/bigserial
) -
nastavte sloupec
NOT NULL DEFAULT nextval('tablename_colname_seq')
-
nastavte, aby sloupec vlastnil sekvenci, aby se s ním automaticky vypustil
Systém není vědět, zda jste to všechno udělali ručně nebo pomocí pseudo datového typu serial
. pgAdmin zkontroluje uvedené funkce a pokud jsou všechny splněny, reverzně vytvořený skript DDL je zjednodušen s odpovídajícím serial
typ. Pokud některá z vlastností není splněna, toto zjednodušení se nekoná. To je něco, co pgAdmin dělá. U základních katalogových tabulek je to vše stejné. Neexistuje žádný serial
typ jako takový.
Neexistuje žádný způsob, jak automaticky přejmenovat vlastněné sekvence. Můžete spustit:
ALTER SEQUENCE ... RENAME TO ...
jako ty. Samotný systém se o jméno nestará . Sloupec DEFAULT
ukládá OID
('foo_pkey_seq'::regclass
), můžete změnit název sekvence bez porušení - OID zůstane stejné. Totéž platí pro cizí klíče a podobné odkazy uvnitř databáze.
Implicitní index primárního klíče je vázán na název omezení PK, což nebude změnit, pokud změníte název tabulky. V Postgres 9.2 nebo novějším můžete použít
ALTER TABLE ... RENAME CONSTRAINT ..
to také napravit.
Mohou existovat také indexy pojmenované podle názvu tabulky. Podobný postup:
ALTER INDEX .. RENAME TO ..
Na název tabulky můžete mít všechny druhy neformálních odkazů. Systém nemůže násilně přejmenovat objekty, které lze pojmenovat jakkoli chcete. A je to jedno.
Samozřejmě nechcete zneplatnit kód SQL, který na tato jména odkazuje. Je zřejmé, že nechcete měnit názvy, dokud na ně aplikační logika odkazuje. Normálně by to u názvů indexů, sekvencí nebo omezení nebyl problém, protože na ně se normálně neodkazuje jménem.
Postgres také získá zámek na objekty před jejich přejmenováním. Pokud tedy existují souběžné transakce otevřené, které mají jakýkoli druh zámku na předmětných objektech, vaše RENAME
operace se zastaví, dokud se tyto transakce nepotvrdí nebo nevrátí zpět.
Systémové katalogy a OID
Schéma databáze je uloženo v tabulkách systémového katalogu v systémovém schématu pg_catalog
. Všechny podrobnosti v návodu zde. Pokud přesně nevíte, co děláte, neměli byste si s těmi tabulkami vůbec zahrávat . Jeden chybný pohyb a můžete rozbít svou databázi. Použijte příkazy DDL, které Postgres poskytuje.
Pro některé z nejdůležitějších tabulek Postgres poskytuje typy identifikátorů objektů a přetypování typů, aby rychle získal název pro OID a naopak. Jako:
SELECT 'foo_pkey_seq'::regclass
Pokud je název schématu v search_path
a název tabulky je jedinečný, což vám dává totéž jako:
SELECT oid FROM pg_class WHERE relname = 'foo_pkey_seq';
Primární klíč většiny katalogových tabulek je oid
a interně většina referencí používá OID.