我试着使用Check if sequence exists in Postgres (plpgsql)的代码.

如果序列不存在,则创建序列.运行此代码两次会导致异常:

序列已经存在了.

如何仅在序列不存在时创建序列?

如果序列不存在,则不应写入任何消息,也不应发生任何错误,因此我不能在回答这个问题的另一个答案中使用存储过程,因为如果序列存在,它每次都会将消息写入日志(log)文件.

do $$
begin

SET search_path = '';
IF not EXISTS (SELECT * FROM pg_class
             WHERE relkind = 'S'
               AND oid::regclass::text = 'firma1.' || quote_ident('myseq'))
  THEN

SET search_path = firma1,public;

create sequence myseq;

END IF;

SET search_path = firma1,public;

end$$;

select nextval('myseq')::int as nr;

推荐答案

博士后9.5或更高

博士后9.5分IF NOT EXISTS was added to CREATE SEQUENCE分.这就是现在的简单解决方案:

CREATE SEQUENCE IF NOT EXISTS myschema.myseq;

但是考虑一下这个过时的答案的细节……br>

博士后9.4或以上

序列与其他几个类似表的对象共享名称空间.The manual:

序列名必须与任何其他序列名不同

我的.所以有三种情况:

  1. Name does not exist. -> Create sequence.
  2. Sequence with the same name exists. -> Do nothing? Any output? Any logging?
  3. Other conflicting object with the same name exists. -> Do something? Any output? Any logging?

指定在这两种情况下要执行的操作.一份DO美元的声明可能是这样的:

DO
$do$
DECLARE
   _kind "char";
BEGIN
   SELECT relkind
   FROM   pg_class
   WHERE  oid = 'myschema.myseq'::regclass  -- sequence name, optionally schema-qualified
   INTO  _kind;

   IF NOT FOUND THEN       -- name is free
      CREATE SEQUENCE myschema.myseq;
   ELSIF _kind = 'S' THEN  -- sequence exists
      -- do nothing?
   ELSE                    -- object name exists for different kind
      -- do something!
   END IF;
END
$do$;

Object types (relkind) in pg_class according to the manual:

r=普通表格

相关的:

Postgresql相关问答推荐

在输入稍有错误的PostgreSQL表中进行快速字符串搜索

如何在PostgreSQL中正确删除数据库

PostgreSQL 不删除旧的 WAL 档案

Npgsql中准备好的语句和参数化查询有什么区别?

如何创建一个触发器来传播对主键表的更新?

如何在 sequelize 使用 db postgres 中通过外键更新记录和更新包含许多记录关系

计算每行的多列中的非 NULL 元素

Postgres 14 反斜杠 Z 没有给出正确的输出

如何在 PostgreSQL hstore 中使用通配符查询值

PostgreSQL:是否可以将枚举转换为整数?

PostgreSQL 如何比 SQLite 更快地执行写入?

如何在 postgres json 列中查询嵌套数组?

在 postgreSQL 中更改序列名称

将主键更改为自动递增

Postgres jsonbNOT contains运算符

SqlAlchemy:多列的不同计数

可以为空的列在 PostgreSQL 中是否会占用额外的空间?

如何从 PostgreSQL 中的 Json 数组中获取元素

如何更改 PostgreSQL 中的日期样式?

如何为 adminpack 解决 PostgreSQL pgAdmin 错误Server instrumentation not installed?