MySQL中UPDATE語句應用的實例教程。本站提示廣大學習愛好者:(MySQL中UPDATE語句應用的實例教程)文章只能為提供參考,不一定能成為您想要的結果。以下是MySQL中UPDATE語句應用的實例教程正文
1、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語句束縛來掌握更新行數。
2、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
當我把數據調到了1000W就更新不了了,上面我來剖析緣由。
實例:須要依據用戶日記的ip地址盤算出其地輿地址
表構造:
用戶日記表(200萬筆記錄),個中address是待填充的字段:
CREATE TABLE `tmp_open_ip` ( `email` varchar(60) NOT NULL DEFAULT '', `address` varchar(50) NOT NULL DEFAULT '', `ip` int(10) unsigned NOT NULL DEFAULT '0', KEY `email` (`email`), KEY `ip` (`ip`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8
另ip地址數據庫表(44萬筆記錄)
CREATE TABLE `ip` ( `s` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '開端ip', `e` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '停止ip', `a` varchar(50) NOT NULL DEFAULT '', KEY `s` (`s`), KEY `e` (`e`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8
須要依據用戶日記表 tmp_open_ip 裡的 ip字段到ip地址數據庫內外查詢出對應的地輿地址,將地址填充到address字段。
應用以下update語句履行:
UPDATE tmp_open_ip AS u INNER JOIN ip ON u.ip BETWEEN ip.s AND ip.e SET u.address = ip.a
在筆者的電腦上運轉了速度異常之慢,履行了一個多小時(4500s)都沒有完,也不曉得還要多久。
其實看不外去,因而想到應用insert 能否會快一些,因而從新導一張表 tmp_open_log 與tmp_open_log完整分歧。
創立一張表 tmp_open_address,是insert的目的表,為了速度更快,沒建索引:
CREATE TABLE `tmp_open_address` ( `email` varchar(60) NOT NULL DEFAULT '', `address` varchar(50) NOT NULL DEFAULT '', `ip` int(10) unsigned NOT NULL DEFAULT '0' ) ENGINE=MyISAM DEFAULT CHARSET=utf8
履行insert 語句
insert into tmp_open_address (email,address,ip) select l.email,ip.a,l.ip from tmp_open_log as l inner join ip on l.ip between ip.s and ip.e ; /* Affected rows: 2,543,124 Found rows: 0 Warnings: 0 Duration for 3 queries: 16.922 sec. */
不到17s!原來還想去倒杯水、稍事歇息一下,成果曾經履行終了。
到本文寫完時,後面的update語句曾經履行了5000s,停止還是遙遙無期。
所以,關於年夜數據量履行update時,可以斟酌改用insert 語句完成,能夠費事一些,但高速帶來的收益弘遠於費事!
跋文:
直接殺逝世了update過程,去看看update履行了若干:運轉
SELECT * FROM `tmp_open_ip` where address!=''
成果只要 11,373 ,照這個速度,要運轉N天....