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

Rinomina in modo sicuro le tabelle utilizzando le colonne della chiave primaria seriale

serial non è un tipo di dati effettivo. Il manuale afferma:

I tipi di dati smallserial , serial e bigserial non sono veri tipi, ma semplicemente una comodità di notazione per la creazione di colonne identificative univoche

Lo pseudo tipo di dati viene risolto facendo tutto ciò:

  • crea una sequenza denominata tablename_colname_seq

  • crea la colonna con tipo integer (o int2 / int8 rispettivamente per smallserial / bigserial )

  • make the column NOT NULL DEFAULT nextval('tablename_colname_seq')

  • fai in modo che la colonna sia proprietaria della sequenza, in modo che venga eliminata automaticamente con essa

Il sistema non sapere se hai fatto tutto questo manualmente o tramite lo pseudo tipo di dati serial . pgAdmin controlla le funzionalità elencate e, se tutte sono soddisfatte, lo script DDL decodificato viene semplificato con la corrispondenza serial genere. Se una delle caratteristiche non è soddisfatta, questa semplificazione non ha luogo. Questo è qualcosa che fa pgAdmin. Per le tabelle del catalogo sottostanti è tutto uguale. Non c'è serial digita come tale.

Non è possibile rinominare automaticamente le sequenze di proprietà. Puoi eseguire:

ALTER SEQUENCE ... RENAME TO ...

come hai fatto tu. Al sistema stesso non interessa il nome . La colonna DEFAULT memorizza un OID ('foo_pkey_seq'::regclass ), è possibile modificare il nome della sequenza senza interromperlo:l'OID rimane lo stesso. Lo stesso vale per chiavi esterne e riferimenti simili all'interno del database.

L'indice implicito per la chiave primaria è legato al nome del vincolo PK, che non cambia se cambi il nome della tabella. In Postgres 9.2 o versioni successive puoi utilizzare

ALTER TABLE ... RENAME CONSTRAINT ..

per correggere anche quello.

Possono esserci anche indici denominati in riferimento al nome della tabella. Procedura simile:

ALTER INDEX .. RENAME TO  ..

Puoi avere tutti i tipi di riferimenti informali al nome della tabella. Il sistema non può rinominare forzatamente oggetti che possono essere nominati come preferisci. E non importa.

Ovviamente non vuoi invalidare il codice SQL che fa riferimento a quei nomi. Ovviamente, non si desidera modificare i nomi mentre la logica dell'applicazione fa riferimento ad essi. Normalmente questo non sarebbe un problema per i nomi di indici, sequenze o vincoli, dal momento che normalmente non si fa riferimento a questi per nome.

Postgres acquisisce anche un blocco sugli oggetti prima di rinominarli. Quindi, se ci sono transazioni simultanee open che hanno qualsiasi tipo di blocco sugli oggetti in questione, il tuo RENAME l'operazione è bloccata fino a quando tali transazioni non vengono eseguite o ripristinate.

Cataloghi di sistema e OID

Lo schema del database è memorizzato nelle tabelle del catalogo di sistema nello schema di sistema pg_catalog . Tutti i dettagli nel manuale qui. Se non sai esattamente cosa stai facendo, non dovresti assolutamente pasticciare con quei tavoli . Una mossa falsa e puoi rompere il tuo database. Usa i comandi DDL forniti da Postgres.

Per alcune delle tabelle più importanti Postgres fornisce tipi di identificatori di oggetti e cast di tipi per ottenere rapidamente il nome per l'OID e viceversa. Come:

SELECT 'foo_pkey_seq'::regclass

Se il nome dello schema è nel search_path e il nome della tabella è univoco, che ti dà lo stesso di:

SELECT oid FROM pg_class WHERE relname = 'foo_pkey_seq';

La chiave primaria della maggior parte delle tabelle di catalogo è oid e internamente, la maggior parte dei riferimenti utilizza OID.