前言:
而今兄弟们对“mysql更新操作”都比较关注,咱们都想要分析一些“mysql更新操作”的相关内容。那么小编也在网络上搜集了一些对于“mysql更新操作””的相关知识,希望兄弟们能喜欢,各位老铁们一起来学习一下吧!上一篇我们介绍了如何使用 INSERT 语句插入数据,本篇继续学习 MySQL 中的数据更新操作,也就是UPDATE语句。
24.1 单表更新
MySQL 使用 UPDATE 语句更新表中的数据,基本的语法如下:
UPDATE table_name SET col1 = expr1, col2 = expr2, ...[WHERE conditions][ORDER BY ...][LIMIT row_count];
其中,table_name 是表名;SET子句指定了需要更新的列和更新后的值(expr1、expr2 或者 DEFAULT),多个字段使用逗号进行分隔;只有满足 WHERE 条件的数据行才会被更新,如果没有指定条件将会更新表中所有行;如果指定了 ORDER BY 子句,按照顺序更新数据行;如果指定了 LIMIT 子句,最多会更新 row_count 行数据。
例如,以下语句为 emp_devp 表中“关平”增加 10% 的月薪和 2000 奖金:
UPDATE emp_devpSET salary = salary * 1.1, bonus = 2000WHERE emp_name = '关平';SELECT emp_name, salary, bonusFROM emp_devpWHERE emp_name = '关平';emp_name|salary |bonus |--------|-------|-------|关平 |7480.00|2000.00|
从查询结果可以看出,“关平”的月薪增加到了 7480,奖金被修改为 2000。
和插入数据一样,更新数据时也会执行约束校验,确保不会产生违反约束的数据。例如,以下更新语句违反了外键约束:
mysql> UPDATE IGNORE employee -> SET dept_id = 10 -> WHERE emp_id = 1;ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`hrdb`.`employee`, CONSTRAINT `fk_emp_dept` FOREIGN KEY (`dept_id`) REFERENCES `department` (`dept_id`))
由于不存在在编号为 10 的部门,所以无法将员工的 dept_id 字段设置为 10。此时,如果在 UPDATE 语句中使用了IGNORE选项,将会忽略执行过程的中错误,当然也不会更新成功。例如:
mysql> UPDATE IGNORE employee -> SET dept_id = 10 -> WHERE emp_id = 1;Query OK, 0 rows affected, 1 warning (0.00 sec)Rows matched: 1 Changed: 0 Warnings: 1mysql> show warnings;+---------+------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+| Level | Code | Message |+---------+------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+| Warning | 1452 | Cannot add or update a child row: a foreign key constraint fails (`hrdb`.`employee`, CONSTRAINT `fk_emp_dept` FOREIGN KEY (`dept_id`) REFERENCES `department` (`dept_id`)) |+---------+------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+1 row in set (0.00 sec)
如果指定了 ORDER BY 子句,MySQL 将会按照指定顺序更新数据。这种方式有一些特殊用途,例如:
DROP TABLE IF EXISTS t;CREATE TABLE t(id int NOT NULL PRIMARY KEY);INSERT INTO t VALUES (1),(2),(3);UPDATE tSET id = id + 1;ERROR 1062 (23000): Duplicate entry '2' for key 't.PRIMARY'
由于 id 字段是主键,更新时会产生唯一键冲突。为了避免这个问题,可以将 id 的值按照从大到小的顺序进行更新:
UPDATE tSET id = id + 1ORDER BY id DESC;SELECT * FROM t;id|--| 2| 3| 4|
对于多个字段的更新,计算的时候按照从左到右的顺序赋值。例如:
UPDATE t1 SET col1 = col1 + 1, col2 = col1;
其中,col2 的值等于 col1 更新后的数据;也就是说,以上语句的执行结果是 col2 和 col1 的值相同。
24.2 跨表更新
连接查询(JOIN )可以用于从多个表中返回关联的数据。同样,UPDATE JOIN语句可以通过关联其他表中的数据进行更新。
UPDATE table_name t[INNER JOIN | LEFT JOIN] other_table ON conditionsSET t.col1 = expr1, t.col2 = expr2WHERE conditions[ORDER BY ...][LIMIT row_count];
其中,table_name 是需要更新数据的表名;INNER JOIN或者LEFT JOIN用于连接其他的表;SET子句指定了需要更新的列和更新后的值,表达式 expr1、expr2 等可以引用 other_table 中的字段;只有满足 WHERE 条件的数据行才会被更新,如果没有指定条件将会更新表中所有行;如果指定了 ORDER BY 子句,按照顺序更新数据行;如果指定了 LIMIT 子句,最多会更新 row_count 行数据。
例如,以下语句通过关联 employee 中的数据更新 emp_devp 中的月薪:
UPDATE emp_devp edJOIN employee d ON (d.emp_id = ed.emp_id)SET ed.salary = d.salary;
以上关联更新语句也可以通过一个子查询实现:
UPDATE emp_devp ed SET salary = (SELECT e.salary FROM employee e WHERE e.emp_id = ed.emp_id);
以上语句在 SET 子句中使用了一个关联子查询,将 employee 表中开发部门所有员工的月薪更新到 emp_devp 表对应的记录中。
24.3 多表更新
MySQL 中的 UPDATE 语句支持同时更新多个表中的数据。例如:
UPDATE emp_devp edJOIN employee e ON (ed.emp_id = e.emp_id)SET ed.salary = e.salary, e.bonus = 0;
该语句通过连接操作同时更新了 emp_devp 和 employee 中的数据。
对于多表更新操作,每个匹配的数据行只会更新一次,即使多次匹配连接条件。另外,多表更新语句不支持 ORDER BY 和 LIMIT 子句。
与单表更新不同的是,多表更新语句中多个字段的赋值不是从左至右顺序执行,而是顺序不确定。
对了,在这里说一下,我目前是在职Java开发,如果你现在正在学习Java,了解Java,渴望成为一名合格的Java开发工程师,在入门学习Java的过程当中有遇见任何关于学习方法,学习路线,学习效率等方面的问题,都可以随时关注并私信我:01,我都会根据大家的问题给出针对性的建议,缺乏基础入门的视频教程也可以直接来找我,我这边有最新的Java基础精讲视频教程, 还有我做Java技术这段时间整理的一些学习手册,面试题,开发工具,PDF文档书籍教程,都可以直接分享给大家。
标签: #mysql更新操作 #mysql更新多个值 #mysql连接update #mysqlupdate关联更新 #mysql联合表更新