【问题标题】:Postgresql insert trigger to concatenatePostgresql插入触发器连接
【发布时间】:2016-02-23 03:09:32
【问题描述】:

我想创建一个触发器来将我的列与“插入前”事件连接起来,但是查询不起作用并且出现错误:

SQL 错误:

错误:“SET”第 4 行或附近的语法错误:SET new.fullname = CONCAT(new.first_name, '', new.mid_name, ...

In statement:
CREATE TRIGGER insert_trigger
BEFORE INSERT ON t_employees
FOR EACH ROW
SET new.fullname = CONCAT(new.first_name, '', new.mid_name, '', new.last_name);

【问题讨论】:

  • Postgres 并没有真正的触发器。我的意思是,它确实有create trigger,但这只是用来执行一个过程(这实际上是一个函数)。你的语法看起来更像 MySQL。
  • 是的,它的 MySQL 语法。我认为它可以在 Postgresql 中使用,但事实并非如此。我尝试使用来自 phpPgAdmin 的相同事件创建插入触发器,但仍然无法正常工作。您能帮我如何在 Postgresql 中创建触发器吗?

标签: sql postgresql triggers


【解决方案1】:

这是一个可行的解决方案:

CREATE TEMPORARY TABLE t_employees (
    first_name TEXT,
    mid_name TEXT,
    last_name TEXT,
    fullname TEXT
);

CREATE OR REPLACE FUNCTION set_fullname()
    RETURNS TRIGGER AS $$
    BEGIN
        NEW.fullname = NEW.first_name || ' ' || NEW.mid_name || ' ' || NEW.last_name;
        RETURN NEW;
    END;
    $$ language 'plpgsql';


CREATE TRIGGER set_fullname_trigger
    BEFORE INSERT OR UPDATE ON t_employees
    FOR EACH ROW
    EXECUTE PROCEDURE set_fullname();


SET client_min_messages TO 'debug';
INSERT INTO t_employees VALUES ('fname1', 'mname1', 'lname1');
SELECT * FROM t_employees;
UPDATE t_employees SET first_name = 'updated-first-name';
SELECT * FROM t_employees;

【讨论】:

    【解决方案2】:

    嗯,我终于做到了。根据您的建议和 postgresql 文档,我已经按照我的意愿制作了触发器。语法如下:

    创建函数:

     CREATE FUNCTION insert_funct() RETURN TRIGGER AS 
        $$
        BEGIN
          SELECT new.fullname := CONCAT(new.first_name, '', new.mid_name, '', new.last_name);
        END;
        $$
        LANGUAGE plpgsql;
    

    然后创建触发器:

    CREATE TRIGGER insert_trigger
      BEFORE INSERT ON t_employees
      FOR EACH ROW
    EXECUTE PROCEDURE insert_funct();
    

    【讨论】:

    • 你的触发函数错误。它会将 all 行的全名设置为当前插入的行之一。另外:首先不需要update。使用new.fullname := concat(...)
    • 还是错了。你确实不需要需要update。只需一行 new.fullname := concat(...); 即可。请参阅手册中的示例:postgresql.org/docs/current/static/…
    • 好吧,我决定不使用触发器,而是使用选择查询“concat”将其组合在一列上。我认为它比使用触发器要好得多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-24
    • 1970-01-01
    • 1970-01-01
    • 2013-04-12
    • 1970-01-01
    • 1970-01-01
    • 2021-10-01
    相关资源
    最近更新 更多