sql >> Databasteknik >  >> RDS >> PostgreSQL

Byt namn på tabeller på ett säkert sätt med seriella primärnyckelkolumner

serial är inte en faktisk datatyp. Manualen säger:

Datatyperna smallserial , serial och bigserial ä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 (eller int2 / int8 respektive för smallserial / 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.




  1. Hur man infogar data direkt från Excel till Oracle Database

  2. Konvertera text till nummer i MySQL-fråga

  3. Att skapa en utlösare för infogning av underordnade tabeller returnerar ett förvirrande fel

  4. CodeIgniter MSSQL-anslutning