Я знаю, что таблицы 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)
появился и исчез? - Есть ли способ переименовать таблицу и перенесите первичную последовательность клавиш одновременно?
- Можно ли переименовать таблицу, затем последовательность, когда клиенты подключены к базе данных, есть ли какие-либо проблемы concurrency?
- Как postgres знают, какую последовательность использовать? Существует ли встроенный триггер базы данных? Есть ли что-нибудь еще, чтобы переименовать, кроме таблицы и последовательности?
- Как насчет неявного индекса, созданного первичным ключом? Следует ли переименовать? Если да, то как это можно сделать?
- Как насчет имени ограничения выше? Он по-прежнему
foo_pkey
. Как переименовано ограничение?