MySQL 和 SQLite 可以对其执行 SQL 添加一个约束吗?就是删改的 SQL 语句必须要带上 where,如果没有就不执行

2024-01-30 01:04:36 +08:00
 nnegier

因为我每次删改的时候都心惊胆战的,生怕忘了 where 导致全局操作数据,所以想问问有没有这样的功能?

2923 次点击
所在节点    MySQL
19 条回复
stinkytofu
2024-01-30 01:34:59 +08:00
我每次删改都会先写 select * , 确认结果没问题再改成 delete ,update , 这样可以大大降低脑残犯错的概率。
Amber2011
2024-01-30 05:35:35 +08:00
MySQL 是有个严格模式的,不过不一定符合你的需求(或者有多余的功能)
DataGrip 是有提示的,命令行和 navicat 没有
kingofzihua
2024-01-30 08:39:02 +08:00
[sql_safe_updates]( https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_sql_safe_updates)


当 sql_safe_updates 设置为 1 时,UPDATE :要有 where ,并查询条件必须使用为索引字段,或者使用 limit ,或者两个条件同时存在,才能正常执行。DELETE:where 条件中带有索引字段可删除,where 中查询条件不是索引,得必须有 limit 。主要是防止 UPDATE 和 DELETE 没有使用索引导致变更及删除大量数据。系统参数默认值为 0



为了防止线上业务出现以下 3 种情况影响线上服务的正常使用和不小心全表数据删除:

1:没有加 where 条件的全表更新操作

2:加了 where 条件字段,但是 where 字段 没有走索引的表更新

3:全表 delete 没有加 where 条件 或者 where 条件没有 走索引
spatxo
2024-01-30 08:42:35 +08:00
说出你的故事
body007
2024-01-30 08:46:11 +08:00
你可以开启事务,更新完了再提交呗。命令行终端别开启自动提交事务(SET autocommit=0;),确定没毛病执行(COMMIT;),有毛病执行(ROLLBACK;)
lcy630409
2024-01-30 09:22:35 +08:00
说出你的事故
guanzhangzhang
2024-01-30 09:27:24 +08:00
😃我现在删目录都先 ls -l xx 看看,然后再上,ctrl a 回到行首,把 ls -l 换成 rm -rf 执行
jorneyr
2024-01-30 09:33:40 +08:00
我们公司产品就是做这个的,我们叫 "SQL 管控",有几百条 SQL 审核规则,违反规则的都会提示或者需要审批后才能执行。
eslizn
2024-01-30 09:34:23 +08:00
之前做过类似的功能,自己起个 proxy ,sqlparse 后分析一下
qeqv
2024-01-30 09:51:26 +08:00
还是改得少了/doge
root71370
2024-01-30 09:58:09 +08:00
nothingistrue
2024-01-30 10:04:39 +08:00
你这违反 SQL 基本准则,基本不可能给你做。3 楼的方案实际上也是性能考虑而不是误操作防呆控制。

实际上,Where 条件填错的误删除,比全表误删除风险更大。还是老是做备份和 SQL 评审吧。
keethebest
2024-01-30 10:08:07 +08:00
生产环境的 sql 操作,我们是有 sql 审核的,估计技术上没办法完全规避,在流程上做预防比较好
aeoic
2024-01-30 10:15:55 +08:00
生产环境关闭 delete 权限,使用逻辑删除.update 一般都是通过主键来更新.不会更新很多行的数据.
Umenezumi
2024-01-30 10:18:25 +08:00
WHERE 1=1


done.
corcre
2024-01-30 10:19:10 +08:00
@stinkytofu 确实, 我也是这么干的, 因为曾经试过一次在生产环境 update 的时候全表的一个字段更新成同一个值了, 现在甚至需要问同事:"你看我这语句写 where 了是吧"...
现在看到(xxxxxx rows affected)的时候 PTSD 都要犯了
cnsdytedison
2024-01-30 11:03:01 +08:00
datagrip 来操作的话,会提醒你,也算是解决了吧。
devilweime
2024-01-30 11:16:57 +08:00
start transaction; 自己手动开启事务
fms
2024-01-30 12:46:14 +08:00
单句执行的话我一般都会用 datagrip 的 preview update 看下与预期是否一样

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1012612

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX