sql >> Database teknologi >  >> RDS >> PostgreSQL

Omdøb sikkert tabeller ved hjælp af serielle primærnøglekolonner

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 (eller int2 / int8 for smallserial / 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.




  1. Undersøger en ORA 02063 DG4ODBC-fejl

  2. Kom godt i gang med Oracle SQL Developer på Windows

  3. Sådan tilføjes en måned til en dato i SQLite

  4. Sådan identificerer du MySQL-ydelsesproblemer med langsomme forespørgsler