一、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 |