一、UPDATE常见用法
首先建立测试环境:
DROP TABLE IF EXISTS t_test;CREATE TABLE t_test ( bs bigint(20) NOT NULL auto_increment, username varchar(20) NOT NULL, password varchar(20) default NULL, remark varchar(200) default NULL, PRIMARY KEY (bs)) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=gbk; INSERT INTO t_test VALUES (1,'lavasoft','123456',NULL);INSERT INTO t_test VALUES (2,'hello',NULL,NULL);INSERT INTO t_test VALUES (3,'haha',zz,tt); |
1、set一个字段
在表t_test中设置第二条记录(bs为2)的password为'***'。
update t_test t set t.password = '***' where t.bs = 2; |
2、set多个字段
在表t_test中设置第一条记录(bs为1)的password为'*'、remark为'*'。
update t_test t set t.password = '*', t.remark = '*' where t.bs = 1; |
3、set null值
在表t_test中设置第三条记录(bs为3)的password为null、remark为null。
update t_test t set t.password = null, t.remark = null where t.bs = 3; |
这个是按照标准语法写的,在不同的数据库系统中,update还有更多的写法,但是标准写法都是支持的。以上三个例子为了说明情况,每次都更新一行。在实际中,可以通过where语句约束来控制更新行数。
二、UPDATE使用中的相关性能问题以及解决方法
UPDATE的功能是更新表中的数据。这的语法和INSERT的第二种用法相似。必须提供表名以及SET表达式,在后面可以加WHERE以限制更新的记录范围。
UPDATE table_anem SET column_name1 = value1, column_name2 = value2, WHERE ; |
如下面的语句将users表中id等于123的记录的age改为24
UPDATE users SET age = 24 WHERE id = 123; |
同样,可以使用UPDATE更新多个字段的值
UPDATE users SET age = 24, name = 'Mike' WHERE id = 123; |
上面的UPDATE语句通过WHERE指定一个条件,否则,UPDATE将更新表中的所有记录的值
百万级别的数据,对于mysql应该没有问题。
你这个sql的问题是,相当于修改ONE表里面所有记录的AGE信息,而修改的过程是,对于每一条ONE里面的记录,去TWO里面查询,再修改。而且,期间很可能会有锁之类的东西。
首先,这种sql不应该出现在业务逻辑里面,而应该是后台的job里面。
如果一定要这么做,可以试着用相反的方式,如果不一样的记录不是特别多,那就找到ONE表里面AGE记录跟TWO表不一样的记录,再修改, 例如大概象下面(可能语法不太对):
update ONE,TWO set ONE.AGE=TWO.AGE where ONE.ID=TWO.ID AND ONE.AGE != TWO.AGE |