博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PostgreSQL忘记输入where条件update更新整张表的解决办法
阅读量:5952 次
发布时间:2019-06-19

本文共 2009 字,大约阅读时间需要 6 分钟。

hot3.png

虽然出现这个错误很挫,但有时候还是会被你或者你的同事碰到。为了避免这个错误,PostgreSQL数据库中可以通过触发器来解决,这里用的是plpgsql 。

1、修改postgresql.conf配置

增加:custom_variable_classes = 'limits'

重新加载:pg_ctl reload

2、创建触发器函数

CREATE OR REPLACE FUNCTION zero_counter() RETURNS TRIGGER LANGUAGE plpgsql AS$BODY$DECLAREBEGIN PERFORM set_config('limits.test', '0', true); IF TG_OP = 'UPDATE' THEN RETURN NEW; END IF; RETURN OLD;END;$BODY$;
CREATE OR REPLACE FUNCTION limit_modifications() RETURNS TRIGGER LANGUAGE plpgsql AS$BODY$DECLARE i INT4;BEGIN i := current_setting('limits.test')::INT4 + 1; PERFORM set_config('limits.test', i::TEXT, true); IF i > 5000 THEN RAISE EXCEPTION '% of more than 5000 row is forbidden.', TG_OP; END IF; IF TG_OP = 'UPDATE' THEN RETURN NEW; END IF; RETURN OLD;END;$BODY$;

3、测试

forummon=# create table test as select i as id, 'password for: ' || i as pass from generate_series(1,10000) i;forummon=# CREATE TRIGGER zero_counter BEFORE UPDATE OR DELETE ON test FOR EACH STATEMENT EXECUTE PROCEDURE zero_counter();CREATE TRIGGERforummon=# CREATE TRIGGER limit_modifications BEFORE UPDATE OR DELETE ON test FOR EACH ROW EXECUTE PROCEDURE limit_modifications();CREATE TRIGGERforummon=# \d+ test  Table "public.test" Column | Type | Modifiers | Storage | Stats target | Description --------+---------+-----------+----------+--------------+------------- id | integer | | plain | |  pass | text | | extended | | Triggers: limit_modifications BEFORE DELETE OR UPDATE ON test FOR EACH ROW EXECUTE PROCEDURE limit_modifications() zero_counter BEFORE DELETE OR UPDATE ON test FOR EACH STATEMENT EXECUTE PROCEDURE zero_counter()Has OIDs: no
forummon=# update test set pass = 'qq' where id<5003 ;ERROR: UPDATE of more than 5000 row is forbidden.forummon=# update test set pass = 'qq' where id<5000 ;UPDATE 4999forummon=# drop table test ;DROP TABLE

总结

批量操作的数量限制可以在limit_modifications中修改,切记在update不确定时先select再update。

参考连接:http://www.depesz.com/2007/07/27/update-account-set-password-new_password-oops/

原文地址:

转载于:https://my.oschina.net/u/270810/blog/502000

你可能感兴趣的文章
常用的Powershell命令
查看>>
单列的用法的网址:
查看>>
Unicode字符编码表
查看>>
C++ sqlite3解决中文排序问题
查看>>
Android 内存管理 &Memory Leak & OOM 分析
查看>>
[转]html5 Canvas画图教程(7)—canvas里画曲线之quadraticCurveTo方法
查看>>
[水]三个数学的小技巧题
查看>>
mysql中查看数据库的版本,什么版本
查看>>
[leetcode-342-Power of Four]
查看>>
MongoDB3.0 创建用户
查看>>
2017-2018-1 20155319 《信息安全系统设计基础》第3周学习总结
查看>>
express 3.0.x 中默认不支持flash() 的解决方法
查看>>
uva-111-dp
查看>>
算法学习1——矩阵转置
查看>>
Tcl与Design Compiler (九)——综合后的形式验证
查看>>
跨页数据传递
查看>>
Linux查看系统负载(CPU和MEM考虑)
查看>>
Codeforces Round #249 (Div. 2) B. Pasha Maximizes
查看>>
MyEclipse 2015 Stable 2.0破解方法
查看>>
【Android游戏开发十一】手把手让你爱上Android sdk自带“9妹”(9patch 工具),让Android游戏开发更方便!...
查看>>