Postgresql添加序列列,如果不是EXISTS仍然创建序列

时间:2018-05-27 15:11:53

标签: sql postgresql

我调用命令

a
在postgresql中

。第一次运行时,会根据需要创建一个具有相应序列的新列。但是,再次运行时,即使列已存在,也会在数据库中创建另一个序列。有没有人知道任何修复来阻止这个新的序列创建?

2 个答案:

答案 0 :(得分:0)

您可以使用以下具有相同效果的步骤:

for i in range(m): 
    A[i].sort()
S = []
for x in range(1, n+1):
    for i in range(m):
        for j in range(len(A[i])):
            if A[i][j] == x:
                S.append((i, j))

现在,如果未创建列并且您收到通知,则表示您已完成。否则继续:

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');

您可能希望将模式名称添加到条件中。

答案 1 :(得分:0)

您似乎发现了一个轻微的错误。我可以在Postgres 9.6和10中重新创建它:

db<>小提琴here

事实上,it has been reported in Sept 2017。到目前为止,尝试修复已被拒绝,因为它会引入其他奇怪的东西。

规避,请考虑Laurenz回答中的建议。也许使用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所获得的通知。

将其包装到带有动态SQL的plpgsql函数中,并使用参数重复使用任意表名和列名。

相关:

模式限定表名以避免歧义。字符串在这里不区分大小写。您不能在问题中使用CaMeL案例拼写。参见: