我调用命令
a
在postgresql中。第一次运行时,会根据需要创建一个具有相应序列的新列。但是,再次运行时,即使列已存在,也会在数据库中创建另一个序列。有没有人知道任何修复来阻止这个新的序列创建?
答案 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案例拼写。参见: