Postgresql ДОБАВЬТЕ СЕРИЙНУЮ КОЛОННУ, ЕСЛИ ЕЩЕ НЕ СУЩЕСТВУЕТ создание последовательностей - PullRequest
0 голосов
/ 27 мая 2018

Я вызываю команду

ALTER TABLE tableName ADD COLUMN IF NOT EXISTS columnName SERIAL

в postgresql.При первом запуске создается новый столбец с соответствующей последовательностью.Однако при повторном запуске в базе данных создается другая последовательность, даже если столбец уже существует.Кто-нибудь знает какие-либо исправления, чтобы остановить создание этой новой последовательности?

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Похоже, вы нашли незначительную ошибку .Я могу воссоздать его в Postgres 9.6 и 10:

db <> fiddle здесь

Фактически, было сообщено вСентябрь 2017 .До сих пор попытка исправления была отклонена, поскольку она привнесла бы другие странности.

К обходу , рассмотрите совет в ответе Лоренца.Может быть автоматизировать с помощью команды DO, например:

DO
$$
BEGIN
IF NOT EXISTS (SELECT FROM pg_attribute
               WHERE  attrelid = 'public.tblname'::regclass  -- table name here 
               AND    attname = 'colname'                    -- column name here
               AND    NOT attisdropped
              ) THEN
   ALTER TABLE public.tblname ADD COLUMN IF NOT EXISTS colname serial;
ELSE
   RAISE NOTICE 'column "colname" of relation "public.tblname" already exists, skipping';
END IF;
END
$$;

Теоретически, существует крошечная раса.Но может ли когда-либо быть несколько транзакций, одновременно изменяющих одну и ту же структуру таблицы?

Сгенерированное уведомление - это то же самое, что и с IF NOT EXISTS.

Оберните это в plpgsqlфункция с динамическим SQL, принимающая параметры для повторного использования с произвольными именами таблиц и столбцов.

Related:

Уточните схему имени таблицы, чтобы избежать двусмысленности.Строки не чувствительны к регистру.Вы не можете использовать правописание в случае CaMeL, которое есть в вашем вопросе.См .:

0 голосов
/ 27 мая 2018

Вы можете использовать следующие шаги, которые имеют тот же эффект:

ALTER TABLE tablename ADD COLUMN IF NOT EXISTS columnname integer;

Теперь, если столбец не создан и вы получили уведомление, все готово.В противном случае выполните следующие действия:

CREATE SEQUENCE IF NOT EXISTS tablename_columnname_seq
   OWNED BY tablename.columnname;
ALTER TABLE tablename ALTER COLUMN columnname
   SET DEFAULT nextval('tablename_columnname_seq');

Кроме того, вы можете проверить, существует ли столбец перед его созданием:

SELECT count(*) FROM information_schema.columns
   WHERE table_name = 'tablename' AND column_name = 'columnname';

Возможно, вы захотите добавить имя схемы в условия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...