gpt4 book ai didi

postgresql - 在另一个表上插入失败时触发保存数据?

转载 作者:行者123 更新时间:2023-11-29 13:49:48 25 4
gpt4 key购买 nike

我在谷歌上搜索了一段时间,没有找到这个问题的答案。

考虑一下,我有一个表test_table(id serial, name varchar(15), surname varchar(40))。如果有人试图在 name 列中插入超过 15 个字符的值,它将返回 permission denied

我需要知道的是,如果有一种方法可以创建一个触发器,当它无法插入到那个test_table时,它在另一个表中保存(插入)所有“丢失”的数据(可能像)log_failed_inserts(failedid int, failedname text, failedsurname text)

请不要回答“只是增加列数限制”之类的问题,因为那只是一个例子。我需要知道是否有办法记录失败的 INSERT 命令的数据。

编辑:只是为了更清楚,因为上面的句子还不够。无论插入时出现什么错误,“无效数据类型”、“长度太大”、“您无权插入”(也许不是最后一个),我都想记录某事/某人试图 在表 test_table 上插入值 X、Y、Z,但失败了

最佳答案

这里最好的解决方案是编写一个函数来捕获 INSERT 期间的任何错误并执行替代方案:

CREATE OR REPLACE FUNCTION do_insert(p_name text, p_surname text) RETURNS void
LANGUAGE plpgsql AS
$$BEGIN
INSERT INTO testtable (name, surname)
VALUES (p_name, p_surname);
EXCEPTION
WHEN OTHERS THEN
INSERT INTO log_failed_inserts(failedname, failedsurname)
VALUES (p_name, p_surname);
END;$$;

如果你不需要函数,你可以使用 DO 语句:

DO
$$BEGIN
INSERT ...
EXCEPTION
WHEN OTHERS THEN
INSERT ...
END;$$;

它的缺点是您不能向它传递参数。

第三种解决方案是在 SQL 中显式使用保存点:

BEGIN;
SAVEPOINT sp1;
INSERT INTO test_table ...;

如果没有错误,继续

COMMIT;

如果有错误:

ROLLBACK TO SAVEPOINT sp1;
INSERT INTO log_failed_inserts ...;
COMMIT;

关于postgresql - 在另一个表上插入失败时触发保存数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42929306/

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