博客
关于我
mysql安全模式: sql_safe_updates
阅读量:792 次
发布时间:2023-02-12

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

MySQL的安全模式:sql_safe_updates介绍

在MySQL中,如果在update和delete操作中没有加上where条件,数据将会全部修改或删除。这不仅会导致数据丢失,还可能对数据库造成严重影响。因此,MySQL提供了一种安全模式来防止这种误操作。

安全模式的开启与关闭

在连接到数据库后,可以通过以下命令查看当前MySQL安全模式的状态:

mysql> show variables like 'sql_safe_updates';

例如,查询结果可能如下:

mysql> show variables like 'sql_safe_updates';+------------------+-------+| Variable_name    | Value |+------------------+-------+| sql_safe_updates | ON    |+------------------+-------+1 row in set (0.00 sec)

如上所示,当sql_safe_updates的值为ON时,安全模式已开启。要开启或关闭安全模式,可以使用以下命令:

mysql> set sql_safe_updates=1; //安全模式打开状态

mysql> set sql_safe_updates=0; //安全模式关闭状态

安全模式UPDATE操作实例

以下是安全模式下update操作的几种常见情况:

  • 无where条件的update

    mysql> update users set status=1;

    错误信息:You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column

    解释:由于没有where条件且没有索引可用,因此操作失败。

  • 无where条件但有limit的update

    mysql> update users set status=1 limit 1;

    成功信息:Query OK, 0 rows affected (0.00 sec)Rows matched: 1 Changed: 0 Warnings: 0

    解释:虽然没有where条件,但加入了limit限制,操作成功。

  • 使用非索引字段作为条件进行更新

    mysql> update users set status=1 where reg_time>'2018-01-01 00:00:00';

    错误信息:You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column

    解释:条件字段不是索引字段且没有limit限制,因此操作失败。

  • 使用非索引字段作为条件并且加入limit进行更新

    mysql> update users set status=1 where reg_time>'2018-01-01 00:00:00' limit 10;

    成功信息:Query OK, 0 rows affected (0.01 sec)Rows matched: 10 Changed: 0 Warnings: 0

    解释:虽然条件字段不是索引字段,但加入了limit限制,操作成功。

  • 使用索引字段作为条件并且不加limit限制进行更新

    mysql> update users set status=1 where phone_num='13800138000';

    成功信息:Query OK, 0 rows affected (0.00 sec)Rows matched: 1 Changed: 0 Warnings: 0

    解释:条件字段是索引字段,因此操作成功。

  • 安全模式DELETE操作实例

    以下是安全模式下delete操作的几种常见情况:

  • 无where条件的delete

    mysql> delete from users;

    错误信息:You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column

    解释:没有where条件且没有索引可用,因此操作失败。

  • 非索引键进行条件删除

    mysql> delete from users where reg_time='2018-06-28 17:35:37';

    错误信息:You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column

    解释:条件字段不是索引键,因此操作失败。

  • 非索引键作为条件并且加入limit进行删除

    mysql> delete from users where reg_time='2018-06-28 17:35:37' limit 1;

    成功信息:Query OK, 1 row affected (0.00 sec)

    解释:虽然不是索引键,但加入了limit限制,操作成功。

  • 使用索引键并且不加limit限制进行删除

    mysql> delete from users where user_id=100000;

    成功信息:Query OK, 1 row affected (0.01 sec)

    解释:条件字段是索引键,因此操作成功。

  • 加入limit但是不使用where条件删除

    mysql> delete from users limit 1;

    错误信息:You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column

    解释:没有使用where条件且不是通过索引键进行筛选,因此操作失败。

  • 总结

    在sql_safe_updates=1的情况下,update和delete操作需要满足以下条件才能执行成功:

    • update操作

    • 使用where子句,并且where子句中列必须为prefix索引列。
    • 使用limit限制。
    • 同时使用where子句和limit(此时where子句中列可以不是索引列)。
    • delete操作

    • 使用where子句,并且where子句中列必须为prefix索引列。
    • 同时使用where子句和limit(此时where子句中列可以不是索引列)。

    转载地址:http://nkdfk.baihongyu.com/

    你可能感兴趣的文章
    mysql加强(5)~DML 增删改操作和 DQL 查询操作
    查看>>
    mysql加强(6)~子查询简单介绍、子查询分类
    查看>>
    mysql加强(7)~事务、事务并发、解决事务并发的方法
    查看>>
    MySQL千万级多表关联SQL语句调优
    查看>>
    mysql千万级大数据SQL查询优化
    查看>>
    MySQL千万级大表优化策略
    查看>>
    MySQL单实例或多实例启动脚本
    查看>>
    MySQL压缩包方式安装,傻瓜式教学
    查看>>
    MySQL原理、设计与应用全面解析
    查看>>
    MySQL原理简介—1.SQL的执行流程
    查看>>
    MySQL参数调优详解
    查看>>
    mysql参考触发条件_MySQL 5.0-触发器(参考)_mysql
    查看>>
    MySQL及navicat for mysql中文乱码
    查看>>
    MySqL双机热备份(二)--MysqL主-主复制实现
    查看>>
    MySQL各个版本区别及问题总结
    查看>>
    MySql各种查询
    查看>>
    mysql同主机下 复制一个数据库所有文件到另一个数据库
    查看>>
    mysql启动以后会自动关闭_驾照虽然是C1,一直是开自动挡的车,会不会以后就不会开手动了?...
    查看>>
    mysql启动和关闭外键约束的方法(FOREIGN_KEY_CHECKS)
    查看>>
    Mysql启动失败解决过程
    查看>>