PostgreSQL触发器函数更新

PostgreSQL触发器函数更新,sql,database,postgresql,web,Sql,Database,Postgresql,Web,我有一个表,其中列sub是列id的第一个数字 id | sub | ---------+-------+ 21 | 2 | 32 | 3 | 43 | 4 | 我想创建一个触发器,当id发生更改时更新sub 下面是我想要的结果示例: id | sub | ---------+-------+ 21 | 2 | 22 | 2 | 43 | 4 |

我有一个表,其中列
sub
是列
id
的第一个数字

    id   |  sub  |
---------+-------+
      21 |   2   |
      32 |   3   |
      43 |   4   |
我想创建一个触发器,当
id
发生更改时更新
sub

下面是我想要的结果示例:

    id   |  sub  |
---------+-------+
      21 |   2   |
      22 |   2   |
      43 |   4   |
在第二行中,
id
的值已从'32'更改为'22',因此
sub
必须从'3'更改为'2'


有人能帮我解决问题吗?

以下是基于您的示例的示例模式:

CREATE TABLE t (id serial, sub int);
INSERT INTO t (sub) values (null);
INSERT INTO t (sub) values (null);
INSERT INTO t (sub) values (null);
您将使用此函数和触发器:

CREATE OR REPLACE FUNCTION setSub() RETURNS TRIGGER AS $$
BEGIN
    NEW.sub := substring(CAST(NEW.id as CHAR(6)), 1, 1);
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER setSub
BEFORE INSERT OR UPDATE ON t
FOR EACH ROW EXECUTE PROCEDURE setSub();
用法示例:

test=# SELECT * FROM t;
 id | sub 
----+-----
  1 |    
  2 |    
  3 |    
(3 rows)

test=# UPDATE t SET id = 3000 WHERE id = 1;
UPDATE 1
test=# SELECT * FROM t;
  id  | sub 
------+-----
    2 |    
    3 |    
 3000 |   3
(3 rows)

test=#