PostgreSQL忘记输入where条件update更新整张表的解决办法
2019独角兽企业重金招聘Python工程师标准>>>
虽然出现这个错误很挫,但有时候还是会被你或者你的同事碰到。为了避免这个错误,PostgreSQL数据库中可以通过触发器来解决,这里用的是plpgsql 。
1、修改postgresql.conf配置
增加:custom_variable_classes = 'limits'
重新加载:pg_ctl reload
2、创建触发器函数
CREATE OR REPLACE FUNCTION zero_counter()RETURNS TRIGGERLANGUAGE plpgsqlAS
$BODY$
DECLARE
BEGINPERFORM set_config('limits.test', '0', true);IF TG_OP = 'UPDATE' THENRETURN NEW;END IF;RETURN OLD;
END;
$BODY$;
CREATE OR REPLACE FUNCTION limit_modifications()RETURNS TRIGGERLANGUAGE plpgsqlAS
$BODY$
DECLAREi INT4;
BEGINi := current_setting('limits.test')::INT4 + 1;PERFORM set_config('limits.test', i::TEXT, true);IF i > 5000 THENRAISE EXCEPTION '% of more than 5000 row is forbidden.', TG_OP;END IF;IF TG_OP = 'UPDATE' THENRETURN 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 TRIGGER
forummon=# CREATE TRIGGER limit_modifications BEFORE UPDATE OR DELETE ON test FOR EACH ROW EXECUTE PROCEDURE limit_modifications();
CREATE TRIGGER
forummon=# \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 4999
forummon=# drop table test ;
DROP TABLE
总结
批量操作的数量限制可以在limit_modifications中修改,切记在update不确定时先select再update。
参考连接:http://www.depesz.com/2007/07/27/update-account-set-password-new_password-oops/
原文地址:http://www.sijitao.net/1996.html
转载于:https://my.oschina.net/u/270810/blog/502000
PostgreSQL忘记输入where条件update更新整张表的解决办法相关推荐
- 涨跌的例题用C语言编辑,仅用一句SQL更新整张表的涨跌幅、涨跌率的解决方案...
问题场景 各大平台店铺的三项评分(物流.服务.商品)变化情况: 商品每日价格的变化记录: 股票的实时涨跌浮: 复现场景 表:主键ID,商品编号,记录时的时间,记录时的价格,创建时间. 问题:获取每个商 ...
- mysql更新两表所有记录语句怎么写_mysql 一条sql语句update更新两个表
mysql 一条sql语句update更新两个表 你写过一条sql语句来修改两个表的数据吗? UPDATE test.table1 t1,test.table2 t2 SET t1.aa='a',t1 ...
- windows update更新时出现错误代码 8024200D解决方法(转)
windows update更新时出现错误代码 8024200D解决方法(转) 参考文章: (1)windows update更新时出现错误代码 8024200D解决方法(转) (2)https:// ...
- 数据库:一张表update另外一张表实践
参考了两个大神的写法: mysql 一张表update另一张表_qwurey的博客-CSDN博客_sql用一张表update另一张表 PostgreSQL根据一张表update另一张表_恩洛的博客-C ...
- 计算机无法更新正在撤销更改,win7系统无法完成更新正在撤销更改的解决办法...
win7系统无法完成更新正在撤销更改的解决办法? 如果我们在使用win7更新系统的时候,出现了win7无法完成更新正在撤销更改请不要关闭你的计算机这样的提示,而且不关闭提醒就会一直收到提示.小编觉得可 ...
- VSCode 更新后打不开之解决办法
VSCode 更新后打不开之解决办法 1 前言 前一段时间在使用 VSCode 的时候,通知窗口弹出了 更新版本 的提示,于是就点了进去,之后它自动的重装等一系列操作.更新完毕之后,等了一大段时间,没 ...
- ACCESS中的Update语句不支持Select的解决办法
ACCESS中的Update语句不支持Select的解决办法执行 比如ACCESS中执行SQL语句: UPDATE HN_news AS a SET typeid = (select clid fro ...
- oracle回退的办法,【案例】Oracle for update回退导致业务阻塞的解决办法
[案例]Oracle for update回退导致业务阻塞的解决办法 时间:2016-11-02 20:53 来源:Oracle研究中心 作者:HTZ 点击: 次 天萃荷净 Oracle研 ...
- 为什么insert操作会把整张表都锁住呢?
为什么insert操作会把整张表都锁住呢? spring oracle 锁表 项目中遇到一个很奇怪的问题: 问题描述:现在需要从项目外部导大量的数据到项目内,这个时候我起了一个spring事务往很多张 ...
最新文章
- 聊一聊ZooKeeper的顺序一致性
- 理解 Delphi 的类(六) - 认识类的封装
- Ubuntu安装软件失败
- python基础教程:startswith()和endswith()的用法
- 安装easy_install 和ipython
- oracle的tns错误,Oracle TNS-12514错误的解决步骤
- 页式管理--物理地址计算问题小结
- Hybird方案-概述
- pygame小游戏——英语单词挑战
- python 开发金山打字通辅助脚本
- 14届数独-真题标准数独-Day 6-20220121(补)
- Vue2实现长按图片识别二维码
- html制作备案表格代码,如何在首页中插入备案编号HTML代码
- My SQL 排序和分组
- java对接海康威视SDK(win64、linux64),处理播放实时流转码,按时间回放功能,附海康威视最新3.0摄像头监控web端实例+插件
- jsp表单提交中文乱码的解决
- bi比较好的公司,bi商业智能软件排名
- SVN异常处理——禁止访问
- 把你的阿里巴巴图标库转成你自己的@ant-design/icons
- c#.net command 命令详细分析
热门文章
- 听说现在都考这些React面试题
- java版电子商务spring cloud分布式微服务b2b2c社交电商(四)SpringBoot 整合JPA
- 什么是区块链预言机(BlockChain Oracle)
- 《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一2.4.6 为克隆使用序列化
- Python:file (read,readline,readline )使用方法
- 算法学习笔记(三)-----各种基础排序问题
- 运行tomcat报Exception in thread ContainerBackgroundProcessor[StandardEngine[Catalina]]
- c#调用存储过程查询表并返回影响的行数
- Git中的日常使用 码云
- Log4j.properties 配置详解