V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
nnegier
V2EX  ›  MySQL

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

  •  1
     
  •   nnegier · 88 天前 · 2575 次点击
    这是一个创建于 88 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    19 条回复    2024-01-30 12:46:14 +08:00
    stinkytofu
        1
    stinkytofu  
       88 天前   ❤️ 3
    我每次删改都会先写 select * , 确认结果没问题再改成 delete ,update , 这样可以大大降低脑残犯错的概率。
    Amber2011
        2
    Amber2011  
       88 天前 via Android
    MySQL 是有个严格模式的,不过不一定符合你的需求(或者有多余的功能)
    DataGrip 是有提示的,命令行和 navicat 没有
    kingofzihua
        3
    kingofzihua  
       88 天前   ❤️ 1
    [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
        4
    spatxo  
       88 天前   ❤️ 2
    说出你的故事
    body007
        5
    body007  
       88 天前
    你可以开启事务,更新完了再提交呗。命令行终端别开启自动提交事务(SET autocommit=0;),确定没毛病执行(COMMIT;),有毛病执行(ROLLBACK;)
    lcy630409
        6
    lcy630409  
       88 天前
    说出你的事故
    guanzhangzhang
        7
    guanzhangzhang  
       88 天前
    😃我现在删目录都先 ls -l xx 看看,然后再上,ctrl a 回到行首,把 ls -l 换成 rm -rf 执行
    jorneyr
        8
    jorneyr  
       88 天前
    我们公司产品就是做这个的,我们叫 "SQL 管控",有几百条 SQL 审核规则,违反规则的都会提示或者需要审批后才能执行。
    eslizn
        9
    eslizn  
       88 天前
    之前做过类似的功能,自己起个 proxy ,sqlparse 后分析一下
    qeqv
        10
    qeqv  
       88 天前
    还是改得少了/doge
    root71370
        11
    root71370  
       88 天前
    nothingistrue
        12
    nothingistrue  
       88 天前   ❤️ 1
    你这违反 SQL 基本准则,基本不可能给你做。3 楼的方案实际上也是性能考虑而不是误操作防呆控制。

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


    done.
    corcre
        16
    corcre  
       88 天前
    @stinkytofu 确实, 我也是这么干的, 因为曾经试过一次在生产环境 update 的时候全表的一个字段更新成同一个值了, 现在甚至需要问同事:"你看我这语句写 where 了是吧"...
    现在看到(xxxxxx rows affected)的时候 PTSD 都要犯了
    cnsdytedison
        17
    cnsdytedison  
       88 天前 via Android
    datagrip 来操作的话,会提醒你,也算是解决了吧。
    devilweime
        18
    devilweime  
       88 天前
    start transaction; 自己手动开启事务
    fms
        19
    fms  
       88 天前 via Android   ❤️ 1
    单句执行的话我一般都会用 datagrip 的 preview update 看下与预期是否一样
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2920 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 14:40 · PVG 22:40 · LAX 07:40 · JFK 10:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.