在MySQL中阻止UPDATE语句没有添加WHERE条件的发生

如果在生产环境中使用UPDATE语句更新表数据,此时如果忘记携带本应该添加的WHERE条件,那么。。Oh,no…后果可能不堪设想。那么有没有什么办法可以阻止这样的事情发生,又不使用任何的审核工具呢。。。办法当然是有的

sql_safe_updates

sql_safe_updates这个MySQL自带的参数就可以完美的解决我们的问题,并且该参数是可以在线变更的哦~当该参数开启的情况下,你必须要在UPDATE语句后携带WHERE条件,否则就会报出ERROR。。

举个栗子

# sql_safe_updates=0,即未开启
[email protected] : test 07:58:34> set sql_safe_updates=0;
Query OK, 0 rows affected (0.00 sec)

[email protected] : test 07:58:43> show variables like ‘sql_safe_updates‘;
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| sql_safe_updates | OFF   |
+------------------+-------+
1 row in set (0.00 sec)

[email protected]127.0.0.1 : test 07:58:55> select * from t;
+-------+
| pd    |
+-------+
| hello |
| mysql |
+-------+
2 rows in set (0.00 sec)

[email protected]127.0.0.1 : test 07:58:59> begin;
Query OK, 0 rows affected (0.00 sec)

[email protected] : test 07:59:04> update t set pd=‘MySQL‘;
Query OK, 2 rows affected (0.00 sec)
Rows matched: 2  Changed: 2  Warnings: 0

[email protected] : test 07:59:12> select * from t;
+-------+
| pd    |
+-------+
| MySQL |
| MySQL |
+-------+
2 rows in set (0.00 sec)

# sql_safe_updates=1,即开启
[email protected]127.0.0.1 : test 08:00:00> set sql_safe_updates=1;
Query OK, 0 rows affected (0.00 sec)

[email protected] : test 08:00:11> show variables like ‘sql_safe_updates‘;
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| sql_safe_updates | ON    |
+------------------+-------+
1 row in set (0.00 sec)

[email protected]127.0.0.1 : test 08:00:16> select * from t;
+-------+
| pd    |
+-------+
| hello |
| mysql |
+-------+
2 rows in set (0.00 sec)

[email protected]127.0.0.1 : test 08:00:25> begin;
Query OK, 0 rows affected (0.00 sec)

[email protected] : test 08:00:27> update t set pd=‘MySQL‘;
ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column

如上属的例子所示,当参数sql_safe_updates开启的时候,UPDATE语句不携带WHERE条件将会爆出一个错误。。所以小心使用UPDATE语句是真的很重要哇。。。

时间: 2024-11-01 05:58:30

在MySQL中阻止UPDATE语句没有添加WHERE条件的发生的相关文章

MySQL中SELECT+UPDATE处理并发更新问题解决方案

这篇文章主要介绍了MySQL中SELECT+UPDATE处理并发更新问题解决方案分享,需要的朋友可以参考下. 问题背景 假设MySQL数据库有一张会员表vip_member(InnoDB表),结构如下: 当一个会员想续买会员(只能续买1个月.3个月或6个月)时,必须满足以下业务要求: 如果end_at早于当前时间,则设置start_at为当前时间,end_at为当前时间加上续买的月数 如果end_at等于或晚于当前时间,则设置end_at=end_at+续买的月数 续买后active_statu

mysql中常用的语句整理

mysql中常用的语句: 1:创建带自增长的主键的表 DROP TABLE IF EXISTS user_login ; CREATE TABLE user_login (   user_id INT  UNSIGNED NOT NULL AUTO_INCREMENT,   user_name VARCHAR(50) DEFAULT NULL,   PRIMARY KEY user_id ) ENGINE=MYISAM  AUTO_INCREMENT=0  DEFAULT CHARSET=utf

MySQL中的replace语句

一.背景 当使用replace语句更新access_apps表时,原有的mark列.remark列的信息丢失. CREATE TABLE `access_apps` (   `base` varchar(11) NOT NULL DEFAULT '',   `business` varchar(64) NOT NULL DEFAULT '',   `owt` varchar(64) NOT NULL DEFAULT '',   `pdl` varchar(64) NOT NULL DEFAULT

MySQL中进行update/delete操作时,发生 Error Code: 1175

问题为个人遇到记录,各位大牛免喷. 在MYSQL的一张表进行 update 操作时,发现不能操作,发生如下错误. 在对 对于此问题, 原因:MYSQL的安全机制造成的,默认是不允许随意进行 删改 数据. 解决办法 : 将安全机制降低, 执行如下语句即可  set sql_safe_updates = 0; 如图:可成功执行update语句

Django的API操作mysql中常用的语句

[背景] 增/删/改/查 如何操作数据库 导入数据库的模型 In [23]: from blog.models import People [增加记录]--三种方法 方法一: 直接使用数据模对象的create函数 In [24]: People.objects.create(name='shuaige') Out[24]: <People: People object> 注意:创建成功返回对象地址 方法二: In [6]: record = People(name='choubaguai') 

mysql中如何创表以及添加各种约束条件

-- 使用数据库hr use hr; -- 在数据库中创建表-- ------------------------------------JOBS表------------------------------------------------------------ 判断数据库中是否存在表JOBSdrop table if exists JOBS;-- 创建表JOBScreate table JOBS ( JOB_ID VARCHAR(10) not null,-- 职位编号,主键 JOB_T

mysql SELECT FOR UPDATE语句使用示例

以MySQL 的InnoDB 为例,预设的Tansaction isolation level 为REPEATABLE READ,在SELECT 的读取锁定主要分为两种方式:SELECT ... LOCK IN SHARE MODE SELECT ... FOR UPDATE这两种方式在事务(Transaction) 进行当中SELECT 到同一个数据表时,都必须等待其它事务数据被提交(Commit)后才会执行.而主要的不同在于LOCK IN SHARE MODE 在有一方事务要Update 同

mysql中,执行delete语句时出现Lock wait timeout exceeded问题

问题描述: 当我插入一条记录时,在调用save方法的时候出现了异常(记录重复了),导致了后面的commit语句不能执行了.这时我在数据库中删除重复记录时发现该表已经被锁上了.即出现错误.但过了一会再次执行delete,就能成功删除记录了. 原因分析: 由于commit语句没有执行到,即事务没有提交成功,表还是被锁着的.只能等锁超时了,才能再次执行delete等操作. 解决办法: 1.遇到问题后可以kill掉对应的线程再次执行delete等操作. 2.为避免问题出现,可以开启mysql中的auto

mysql中的判断语句

在mysql中,有时候我们需要在生成数据之前先做一些基础判断,这个时候我们可以case then使用简单的判断 SELECT CASE sex WHEN 1 THEN '男' WHEN 2 THEN '女' ELSE '无性别' END as content from 表名