serial
er ikke en egentlig datatype. Manualen siger:
Datatyperne smallserial
, serial
og bigserial
er ikke sande typer, men blot en notationsbekvemmelighed til at oprette unikke identifikatorkolonner
Pseudodatatypen løses ved at gøre alt dette:
-
opret en sekvens ved navn
tablename_colname_seq
-
opret kolonnen med typen
integer
(ellerint2
/int8
forsmallserial
/bigserial
) -
lav kolonnen
NOT NULL DEFAULT nextval('tablename_colname_seq')
-
få kolonnen til at eje sekvensen, så den automatisk bliver droppet med den
Systemet gør ikke vide, om du gjorde alt dette i hånden eller ved hjælp af pseudodatatypen serial
. pgAdmin kontrollerer de angivne funktioner, og hvis alle er opfyldt, forenkles det omvendt manipulerede DDL-script med den matchende serial
type. Hvis et af funktionerne ikke er opfyldt, finder denne forenkling ikke sted. Det er noget pgAdmin gør. For de underliggende katalogtabeller er det det samme. Der er ingen serial
skriv som sådan.
Der er ingen måde at automatisk omdøbe ejede sekvenser. Du kan køre:
ALTER SEQUENCE ... RENAME TO ...
ligesom du gjorde. Systemet i sig selv er ligeglad med navnet . Kolonnen DEFAULT
gemmer en OID
('foo_pkey_seq'::regclass
), kan du ændre navnet på sekvensen uden at bryde det - OID'en forbliver den samme. Det samme gælder fremmednøgler og lignende referencer inde i databasen.
Det implicitte indeks for den primære nøgle er bundet til navnet på PK-begrænsningen, hvilket ikke vil ændres, hvis du ændrer navnet på tabellen. I Postgres 9.2 eller nyere kan du bruge
ALTER TABLE ... RENAME CONSTRAINT ..
for også at rette op på det.
Der kan også være indekser navngivet med henvisning til tabelnavnet. Lignende procedure:
ALTER INDEX .. RENAME TO ..
Du kan have alle slags uformelle referencer til tabelnavnet. Systemet kan ikke med magt omdøbe objekter, der kan navngives, hvad du vil. Og det er ligeglad.
Selvfølgelig ønsker du ikke at ugyldiggøre SQL-kode, der refererer til disse navne. Det er klart, at du ikke ønsker at ændre navne, mens applikationslogikken refererer til dem. Normalt ville dette ikke være et problem for navne på indekser, sekvenser eller begrænsninger, da disse normalt ikke refereres til ved navn.
Postgres får også en lås på objekter, før de omdøber dem. Så hvis der er samtidige transaktioner åbne, der har nogen form for lås på de pågældende objekter, din RENAME
driften er gået i stå, indtil disse transaktioner forpligtes eller rulles tilbage.
Systemkataloger og OID'er
Databaseskemaet er gemt i tabeller i systemkataloget i systemskemaet pg_catalog
. Alle detaljer i manualen her. Hvis du ikke ved præcis, hvad du laver, bør du slet ikke rode med disse borde . Et falsk træk, og du kan bryde din database. Brug de DDL-kommandoer Postgres giver.
For nogle af de vigtigste tabeller leverer Postgres objektidentifikatortyper og typecasts for hurtigt at få navnet på OID'en og omvendt. Ligesom:
SELECT 'foo_pkey_seq'::regclass
Hvis skemanavnet er i search_path
og tabelnavnet er unikt, hvilket giver dig det samme som:
SELECT oid FROM pg_class WHERE relname = 'foo_pkey_seq';
Den primære nøgle i de fleste katalogtabeller er oid
og internt bruger de fleste referencer OID'er.