serial
är inte en faktisk datatyp. Manualen säger:
Datatyperna
smallserial
,serial
ochbigserial
är inte sanna typer, utan bara en notationsbekvämlighet för att skapa unika identifierarkolumner
Pseudodatatypen löses genom att göra allt detta:
-
skapa en sekvens med namnet
tablename_colname_seq
-
skapa kolumnen med typen
integer
(ellerint2
/int8
respektive försmallserial
/bigserial
) -
gör kolumnen
NOT NULL DEFAULT nextval('tablename_colname_seq')
-
gör att kolumnen äger sekvensen så att den släpps automatiskt med den
Systemet inte vet om du gjorde allt detta för hand eller med hjälp av pseudodatatypen serial
. pgAdmin kontrollerar de listade funktionerna och om alla är uppfyllda, förenklas det omvända DDL-skriptet med den matchande serial
typ. Om någon av funktionerna inte uppfylls sker inte denna förenkling. Det är något pgAdmin gör. För de underliggande katalogtabellerna är det samma sak. Det finns ingen serial
typ som sådan.
Det finns inget sätt att automatiskt byta namn på ägda sekvenser. Du kan köra:
ALTER SEQUENCE ... RENAME TO ...
som du gjorde. Systemet i sig bryr sig inte om namnet . Kolumnen DEFAULT
lagrar en OID
('foo_pkey_seq'::regclass
), kan du ändra namnet på sekvensen utan att bryta det - OID förblir detsamma. Detsamma gäller främmande nycklar och liknande referenser inuti databasen.
Det implicita indexet för primärnyckeln är bundet till namnet på PK-begränsningen, vilket inte ändras om du ändrar namnet på tabellen. I Postgres 9.2 eller senare kan du använda
ALTER TABLE ... RENAME CONSTRAINT ..
för att rätta till det också.
Det kan också finnas index namngivna med hänvisning till tabellnamnet. Liknande procedur:
ALTER INDEX .. RENAME TO ..
Du kan ha alla typer av informella referenser till tabellnamnet. Systemet kan inte tvingas byta namn på objekt som kan döpas till vad du vill. Och det bryr sig inte.
Naturligtvis vill du inte ogiltigförklara SQL-kod som refererar till dessa namn. Uppenbarligen vill du inte ändra namn medan applikationslogik refererar till dem. Normalt skulle detta inte vara ett problem för namn på index, sekvenser eller begränsningar, eftersom dessa normalt inte refereras till med namn.
Postgres skaffar också ett lås på objekt innan de döper om dem. Så om det finns samtidiga transaktioner öppna som har någon form av lås på objekten i fråga, din RENAME
driften stoppas tills dessa transaktioner genomförs eller rullas tillbaka.
Systemkataloger och OID
Databasschemat lagras i tabeller i systemkatalogen i systemschemat pg_catalog
. Alla detaljer i manualen här. Om du inte vet exakt vad du gör bör du inte bråka med de borden alls . Ett falskt drag och du kan bryta din databas. Använd DDL-kommandona som Postgres tillhandahåller.
För några av de viktigaste tabellerna tillhandahåller Postgres objektidentifieringstyper och typcasts för att snabbt få namnet för OID och vice versa. Gilla:
SELECT 'foo_pkey_seq'::regclass
Om schemanamnet finns i search_path
och tabellnamnet är unikt, vilket ger dig samma sak som:
SELECT oid FROM pg_class WHERE relname = 'foo_pkey_seq';
Den primära nyckeln för de flesta katalogtabeller är oid
och internt använder de flesta referenser OID.