gpt4 book ai didi

postgresql - 触发器自动更新postgresql中的列

转载 作者:行者123 更新时间:2023-11-29 13:40:02 33 4
gpt4 key购买 nike

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

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

在 main_WC4 中创建并添加 Throughput_Worktype 字段:

ALTER TABLE wc4  ADD COLUMN throughput_wrktype VARCHAR(50);

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

为每次上传新文件时在 throughput_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();

最佳答案

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

-- 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)

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

关于postgresql - 触发器自动更新postgresql中的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56959937/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com