Похоже, вы нашли незначительную ошибку .Я могу воссоздать его в 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, которое есть в вашем вопросе.См .: