Безопасно и чисто переименовывать таблицы, использующие последовательные первичные ключи столбцов в Postgres?
Я знаю, что таблицы PostgreSQL, использующие первичный ключ SERIAL, в конечном итоге создают неявный индекс, последовательность и ограничение, создаваемые PostgreSQL. Вопрос в том, как переименовать эти неявные объекты при переименовании таблицы. Ниже моя попытка выяснить это с конкретными вопросами в конце.
Учитывая таблицу, такую как
CREATE TABLE foo (
pkey SERIAL PRIMARY KEY,
value INTEGER
);
Выводы 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 показывает следующее как DDL для таблицы
CREATE TABLE foo
(
pkey serial NOT NULL,
value integer,
CONSTRAINT foo_pkey PRIMARY KEY (pkey )
)
WITH (
OIDS=FALSE
);
ALTER TABLE foo
OWNER TO postgres;
Теперь переименуйте таблицу
ALTER table foo RENAME TO bar;
Выход Postgres
Query returned successfully with no result in 17 ms.
PgAdmin III SQL панель для таблицы
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;
Обратите внимание на дополнительныеDEFAULT nextval('foo_pkey_seq'::regclass),
это означает, что переименование таблицы не переименовывает последовательность для первичных ключей, но теперь у нас есть это явноеnextval()
.
Теперь переименуйте последовательность
Я хочу, чтобы имена баз данных соответствовали друг другу, поэтому я попытался
ALTER SEQUENCE foo_pkey_seq RENAME TO bar_pkey_seq;
Query returned successfully with no result in 17 ms.
Глядя на панель SQL в pgAdmin III я вижу
CREATE TABLE bar
(
pkey serial NOT NULL,
value integer,
CONSTRAINT foo_pkey PRIMARY KEY (pkey )
)
WITH (
OIDS=FALSE
);
ALTER TABLE bar
OWNER TO postgres;
DEFAULT nextval('foo_pkey_seq'::regclass),
ушел
ВОПРОСОВ
ПочемуDEFAULT nextval('foo_pkey_seq'::regclass)
Заявление появляется и исчезает?Есть ли способ переименовать таблицу и одновременно переименовать последовательность первичных ключей?Безопасно ли переименовывать таблицу, затем последовательность, пока клиенты подключены к базе данных, есть ли проблемы с параллелизмом?Как Postgres знает, какую последовательность использовать? Есть ли триггер базы данных для внутреннего использования? Есть ли что-нибудь еще, чтобы переименовать, кроме таблицы и последовательности?Как насчет неявного индекса, созданного первичным ключом? Это должно быть переименовано? Если так, как это можно сделать?А как насчет имени ограничения выше? Это все ещеfoo_pkey
, Как ограничение переименовано?