Bezpiecznie i czysto zmień nazwy tabel, które używają kolumn klucza szeregowego w Postgres?

Wiem, że tabele PostgreSQL, które używają klucza głównego SERIAL, mają niejawny indeks, sekwencję i ograniczenia tworzone przez PostgreSQL. Pytanie brzmi, jak zmienić nazwy tych niejawnych obiektów, gdy zmieni się ich nazwę. Poniżej przedstawiam moją próbę rozszyfrowania tego na podstawie konkretnych pytań na końcu.

Biorąc pod uwagę stół taki jak

CREATE TABLE foo (
    pkey SERIAL PRIMARY KEY,
    value INTEGER
);

Wyjścia Postgres

NOTICE:  CREATE TABLE will create implicit sequence "foo_pkey_seq" for serial column "foo.pkey"
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "foo_pkey" for table "foo"
Query returned successfully with no result in 52 ms.

PgAdmin III pokazuje następujące dane jako DDL dla tabeli

CREATE TABLE foo
(
  pkey serial NOT NULL,
  value integer,
  CONSTRAINT foo_pkey PRIMARY KEY (pkey )
)
WITH (
  OIDS=FALSE
);
ALTER TABLE foo
  OWNER TO postgres;

Teraz zmień nazwę tabeli

ALTER table foo RENAME TO bar;

Wyjście Postgres

Query returned successfully with no result in 17 ms.

Panel SQL PgAdmin III dla tabeli

CREATE TABLE bar
(
  pkey integer NOT NULL DEFAULT nextval('foo_pkey_seq'::regclass),
  value integer,
  CONSTRAINT foo_pkey PRIMARY KEY (pkey )
)
WITH (
  OIDS=FALSE
);
ALTER TABLE bar
  OWNER TO postgres;

Zwróć uwagę na dodatkoweDEFAULT nextval('foo_pkey_seq'::regclass), oznacza to, że zmiana nazwy tabeli nie zmienia nazwy sekwencji kluczy podstawowych, ale teraz mamy to wyraźnienextval().

Teraz zmień nazwę sekwencji

Chcę zachować spójność nazewnictwa bazy danych, więc spróbowałem

ALTER SEQUENCE foo_pkey_seq RENAME TO bar_pkey_seq;
Query returned successfully with no result in 17 ms.

Patrząc na okienko SQL w pgAdmin III widzę

CREATE TABLE bar
(
  pkey serial NOT NULL,
  value integer,
  CONSTRAINT foo_pkey PRIMARY KEY (pkey )
)
WITH (
  OIDS=FALSE
);
ALTER TABLE bar
  OWNER TO postgres;

TheDEFAULT nextval('foo_pkey_seq'::regclass), przepadło.

PYTANIA

DlaczegoDEFAULT nextval('foo_pkey_seq'::regclass) oświadczenie pojawia się i znika?Czy można zmienić nazwę tabeli i jednocześnie zmienić nazwę sekwencji klucza podstawowego?Czy zmiana nazwy tabeli jest bezpieczna, a następnie, gdy klienci są połączeni z bazą danych, czy są jakieś problemy z współbieżnością?W jaki sposób postgres wie, jakiej sekwencji użyć? Czy jest używany wewnętrzny wyzwalacz bazy danych? Czy jest jeszcze coś do zmiany nazwy innej niż tabela i sekwencja?Co z niejawnym indeksem utworzonym przez klucz podstawowy? Czy należy zmienić nazwę? Jeśli tak, jak można to zrobić?A co z nazwą ograniczenia powyżej? To jest nadalfoo_pkey. Jak zmienić nazwę ograniczenia?

questionAnswers(1)

yourAnswerToTheQuestion