PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Bezpiecznie zmieniaj nazwy tabel za pomocą kolumn klucza podstawowego szeregowego

serial nie jest rzeczywistym typem danych. Instrukcja stwierdza:

Typy danych smallserial , serial i bigserial nie są prawdziwymi typami, a jedynie ułatwieniem w tworzeniu unikalnych kolumn identyfikatorów

Pseudotyp danych jest rozwiązywany, wykonując to wszystko:

  • utwórz sekwencję o nazwie tablename_colname_seq

  • utwórz kolumnę z typem integer (lub int2 / int8 odpowiednio dla smallserial / bigserial )

  • utwórz kolumnę NOT NULL DEFAULT nextval('tablename_colname_seq')

  • spraw, aby kolumna była właścicielem sekwencji, tak aby była automatycznie usuwana z nią

System nie wiesz, czy zrobiłeś to wszystko ręcznie, czy za pomocą pseudotypu danych serial . pgAdmin sprawdza wymienione funkcje i jeśli wszystkie są spełnione, skrypt DDL poddany inżynierii wstecznej jest uproszczony za pomocą pasującego serial rodzaj. Jeżeli jedna z cech nie jest spełniona, to uproszczenie nie ma miejsca. To jest coś, co robi pgAdmin. W przypadku bazowych tabel katalogu wszystko jest takie samo. Nie ma serial wpisz jako takie.

Nie ma możliwości automatycznej zmiany nazw posiadanych sekwencji. Możesz uruchomić:

ALTER SEQUENCE ... RENAME TO ...

tak jak ty. Sam system nie dba o nazwę . Kolumna DEFAULT przechowuje OID ('foo_pkey_seq'::regclass ), możesz zmienić nazwę sekwencji bez jej łamania - OID pozostaje bez zmian. To samo dotyczy kluczy obcych i podobnych odniesień w bazie danych.

Niejawny indeks klucza podstawowego jest powiązany z nazwą ograniczenia PK, które nie zmienić, jeśli zmienisz nazwę tabeli. W Postgresie 9.2 lub nowszym możesz użyć

ALTER TABLE ... RENAME CONSTRAINT ..

aby to naprawić.

Mogą być również indeksy nazwane w odniesieniu do nazwy tabeli. Podobna procedura:

ALTER INDEX .. RENAME TO  ..

Możesz mieć wszelkiego rodzaju nieformalne odniesienia do nazwy tabeli. System nie może wymusić zmiany nazw obiektów, które można nazwać w dowolny sposób. I to nie obchodzi.

Oczywiście nie chcesz unieważniać kodu SQL, który odwołuje się do tych nazw. Oczywiście nie chcesz zmieniać nazw, gdy logika aplikacji odwołuje się do nich. Normalnie nie stanowiłoby to problemu w przypadku nazw indeksów, sekwencji lub ograniczeń, ponieważ zwykle nie są one określane nazwą.

Postgres blokuje również obiekty przed zmianą ich nazwy. Więc jeśli jest jednoczesna transakcja otwarte, które mają jakąkolwiek blokadę na przedmiotowych obiektach, twoja RENAME operacja jest zablokowana do momentu zatwierdzenia lub wycofania tych transakcji.

Katalogi systemowe i identyfikatory OID

Schemat bazy danych jest przechowywany w tabelach katalogu systemowego w schemacie systemu pg_catalog . Wszystkie szczegóły w instrukcji tutaj. Jeśli nie wiesz dokładnie, co robisz, w ogóle nie powinieneś bawić się przy tych stołach . Jeden fałszywy ruch i możesz złamać bazę danych. Użyj poleceń DDL, które zapewnia Postgres.

W przypadku niektórych z najważniejszych tabel Postgres udostępnia typy identyfikatorów obiektów i rzutowania typów, aby szybko uzyskać nazwę OID i na odwrót. Na przykład:

SELECT 'foo_pkey_seq'::regclass

Jeśli nazwa schematu znajduje się w search_path a nazwa tabeli jest unikalna, co daje to samo, co:

SELECT oid FROM pg_class WHERE relname = 'foo_pkey_seq';

Kluczem podstawowym większości tabel katalogu jest oid i wewnętrznie większość referencji używa OID.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wyzwalacz Postgres po uzyskaniu dostępu do insertu NOWOŚĆ

  2. Porównanie opcji baz danych w chmurze dla PostgreSQL

  3. PostgreSQL działa wolno? Wskazówki i porady, jak dotrzeć do źródła

  4. Wykryj, czy wartość zawiera przynajmniej jedną cyfrę w PostgreSQL

  5. Rails 3.2 Postgres Save Error ActiveRecord::StatementInvalid:PG::Error:ERROR:Błąd składni w pobliżu 'T' na pozycji 5