我在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();
答案 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)
现在表中的数据已重复,但这就是您想要的。