sql >> Databáze >  >> RDS >> PostgreSQL

Bezpečně přejmenovávejte tabulky pomocí sloupců sériového primárního klíče

serial není skutečný datový typ. V návodu je uvedeno:

Datové typy smallserial , serial a bigserial 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 (nebo int2 / int8 respektive pro smallserial / 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.




  1. Přehled sériového pseudo-datového typu pro PostgreSQL

  2. K získání informací o serveru v SQL Server použijte SERVERPROPERTY().

  3. Jak nainstalovat phpMyAdmin

  4. Vytvořte databázi MySQL z Javy