博客
关于我
mysql安全模式: sql_safe_updates
阅读量:795 次
发布时间: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存储引擎--MYSIAM和INNODB引擎区别
    查看>>
    Mysql存储引擎(2):存储引擎特点
    查看>>
    MySQL存储引擎--MyISAM与InnoDB区别
    查看>>
    mysql存储总结
    查看>>
    mysql存储登录_php调用mysql存储过程会员登录验证实例分析
    查看>>
    MySql存储过程中limit传参
    查看>>
    MySQL存储过程入门
    查看>>
    mysql存储过程批量建表
    查看>>
    MySQL存储过程的使用实现数据快速插入
    查看>>
    mysql存储过程详解
    查看>>
    Mysql存表情符号发生错误
    查看>>
    MySQL学习-group by和having
    查看>>
    MySQL学习-MySQL数据库事务
    查看>>
    MySQL学习-MySQL条件查询
    查看>>
    MySQL学习-SQL语句的分类与MySQL简单查询
    查看>>
    MySQL学习-子查询及limit分页
    查看>>
    MySQL学习-排序与分组函数
    查看>>
    MySQL学习-连接查询
    查看>>
    Mysql学习总结(10)——MySql触发器使用讲解
    查看>>
    Mysql学习总结(11)——MySql存储过程与函数
    查看>>