在表中插入时获取当前表OID(regclass)

时间:2016-06-21 10:19:20

标签: postgresql function api

我有一个表,其中一列存储记录来自的表table OID。如果必须填写此字段(NOT NULL),但如果未提供,则可以具有默认值。我想在插入时存储当前的table OID

CREATE TABLE t AS(
    Source regclass NOT NULL DEFAULT current_table_name()::regclass
);

postgreSQL表中是否有任何函数(current_table_name)来执行此任务?

1 个答案:

答案 0 :(得分:1)

没有这样的功能,但您可以通过三个步骤实现目标:

  1. 创建没有DEFAULT的表格。
  2. 找到新表的OID。
  3. ALTER表格并设置DEFAULT
  4. 最好使用表OID而不是将表名转换为regclass,因为后者INSERT在重命名表后会突然失败。

    这是一个DO块,可以实现:

    DO $$DECLARE
       reloid oid;
    BEGIN
       CREATE TABLE t (source regclass NOT NULL);
       SELECT t.oid INTO reloid
          FROM pg_class t
               JOIN pg_namespace n ON t.relnamespace = n.oid
          WHERE t.relname = 't' AND n.nspname = current_schema;
       EXECUTE 'ALTER TABLE t ALTER source SET DEFAULT ' || reloid;
    END;$$;