如何在插入之前更改触发器函数内复合类型列的值?

时间:2017-02-06 16:56:39

标签: sql postgresql

我有一个表格,其中包含以下列:

  1. inspireId 类型:inspireid (复合型)
  2. gid 类型:整数(主键)
  3. inspireId列类型如下:

    CREATE TYPE inspireId AS (
      nameSpace text,
      local_id integer
    )
    

    我想在表格中创建新行时自动使用gid的值填充local_id。

    我尝试了以下内容:

    CREATE OR REPLACE FUNCTION script.addLocalId() RETURNS TRIGGER AS
    $$
        BEGIN
            NEW."inspireId".local_id := NEW.gid;
            RETURN NEW;
        END;
    $$ LANGUAGE plpgsql;
    

    但这不起作用。创建触发器函数时抛出以下错误:

      

    «new.inspireId.local_id»不是已知变量。

    这个的正确语法是什么?

2 个答案:

答案 0 :(得分:1)

您无法直接访问类型元素。

CREATE OR REPLACE FUNCTION script.addLocalId() RETURNS TRIGGER AS
$$
    BEGIN
        NEW."inspireId" = ((NEW.inspireId).nameSpace, NEW.gid)::inspireId;
        RETURN NEW;
    END;
$$ LANGUAGE plpgsql;

答案 1 :(得分:1)

CREATE OR REPLACE FUNCTION script.addLocalId() RETURNS TRIGGER AS
$$
BEGIN
    SELECT (
         'any value for nameSpace ', 
          NEW.gid
    )::inspireId INTO NEW.inspireId;

    RETURN NEW;
END;
$$ LANGUAGE plpgsql;