触发自动更新PostgreSQL中的列

时间:2019-07-09 20:15:50

标签: postgresql

我在PostgreSQL中有一个表,在其中添加了一个新列,该新列是该表中已经存在的2列的串联。我能够使用concat函数并将值添加到该表中表中所有现有数据的位置。现在的问题是,当我想从txt文件向该表添加更多数据时,它给了我错误:缺少“ xzy”列的数据。

为解决此问题,我尝试制作触发器,以便每次上载文件时都会自动合并并将数据添加到该新列“ xyz”。到目前为止,我一直没有成功。

main_ WC4中的创建和添加吞吐量_工作类型字段:

ALTER TABLE wc4  ADD COLUMN throughput_wrktype VARCHAR(50);

UPDATE wc4 SET throughput_wrktype = concat(trim('' from wrktype), '-', replace (unitcd,'-','' ));

创建触发器,以便每次上传新文件时都会在yield_worktype列中自动更新值:

CREATE OR REPLACE FUNCTION befo_insert()
  RETURNS trigger AS
$$
BEGIN
NEW.throughput_wrktype = concat(trim('' from new.wrktype),   '-', replace (new.unitcd,'-','' ));
RETURN NEW;
END;

$$
LANGUAGE 'plpgsql';

CREATE TRIGGER concat_before_update
  BEFORE  update
  ON wc4
  FOR EACH ROW          EXECUTE PROCEDURE befo_insert();

1 个答案:

答案 0 :(得分:0)

我认为这就是您所需要的。我创建了一个表格并填充以进行测试。根据您的需要采用代码。使用函数填充第三列的字段(我仅使用简单的concat)。您可能需要添加触发器和函数来更新表中的记录。

-- create a table 'some_table'
CREATE TABLE some_table(
   column1 VARCHAR (16) UNIQUE NOT NULL,
   column2 VARCHAR (16) NOT NULL
   );

-- fill the table with some data
INSERT INTO some_table VALUES ('a', '00001');
INSERT INTO some_table VALUES ('b', '00002');

-- look what's in the table
SELECT * FROM some_table;

 column1 | column2 
---------+---------
 a       | 00001
 b       | 00002
(2 rows)

-- add the third column 'column3' and populate it 
ALTER TABLE some_table ADD COLUMN column3 VARCHAR(35);
UPDATE some_table SET column3= CONCAT(column1, ' - ', column2);

--take look in the table
SELECT * FROM some_table;

 column1 | column2 |  column3  
---------+---------+-----------
 a       | 00001   | a - 00001
 b       | 00002   | b - 00002
(2 rows)

-- create function that update table after each inserting into 'some_table'
CREATE FUNCTION some_table_insert() RETURNS TRIGGER AS $$
BEGIN
  UPDATE some_table SET column3 = concat(NEW.column1,  ' - ', NEW.column2) WHERE column1 = NEW.column1;
  RETURN new;
END;
$$ LANGUAGE plpgsql;

-- create trigger that calls function 'some_table_insert' after each insert into "some_table"
CREATE TRIGGER some_table_insert_trigger AFTER INSERT ON some_table FOR EACH ROW EXECUTE PROCEDURE some_table_insert();

-- insert into the table
INSERT INTO some_table VALUES ('c', '00003');

-- see the result
SELECT * FROM some_table;

 column1 | column2 |  column3  
---------+---------+-----------
 a       | 00001   | a - 00001
 b       | 00002   | b - 00002
 c       | 00003   | c - 00003
(3 rows)

现在表中的数据已重复,但这就是您想要的。