MySQL實現(xiàn)批量更新不同表中的數(shù)據(jù)
批量更新不同表的數(shù)據(jù)
今天翻到以前寫的批量更新表中的數(shù)據(jù)的存儲過程,故在此做一下記錄。
當(dāng)時MySQL中的表名具有如下特征,即根據(jù)需求將業(yè)務(wù)表類型分為了公有、私有和臨時三種類型,即不同的業(yè)務(wù)對應(yīng)三張表,而所做的是區(qū)分出是什么類型(公有、私有、臨時)的業(yè)務(wù)表對數(shù)據(jù)的固定字段做統(tǒng)一規(guī)律的處理。
下面為當(dāng)時所編寫的存儲過程
BEGIN DECLARE done INT; DECLARE v_table_name VARCHAR(100); DECLARE v_disable VARCHAR(100); DECLARE v_disable_temp VARCHAR(100); -- 存放最終刪除sql DECLARE v_table_pre VARCHAR(100); DECLARE v_table_sub VARCHAR(200); DECLARE v_disable_temp_2 VARCHAR(100); -- 查詢testkaifa庫中以'temp_test_p_'開頭的表 DECLARE cursor_table_gis CURSOR FOR SELECT DISTINCT table_name tableName FROM information_schema.columns WHERE table_schema = 'testkaifa' AND table_name LIKE '%temp_test_p_%'; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; SELECT @done; OPEN cursor_table_gis; cursor_loop: LOOP FETCH cursor_table_gis INTO v_table_name; IF done = 1 THEN LEAVE cursor_loop; END IF; -- 連接字符串函數(shù) SET @v_disable = concat_ws(' ', 'update ', v_table_name, 'set is_valid=false where expire_time>now();'); SELECT @v_disable; PREPARE sqlstr FROM @v_disable; EXECUTE sqlstr; DEALLOCATE PREPARE sqlstr; SELECT substring_index(v_table_name, '_', 1) INTO v_table_pre; -- IF v_table_pre = 'temp' THEN SELECT reverse(left(reverse(v_table_name), instr(reverse(v_table_name), '_'))) INTO v_table_sub; SET @v_disable_temp = concat_ws(' ', 'update ', v_table_name, 'set is_valid=false where (expire_time-now())> (select value_data from ', concat('platform_params_p', v_table_sub), 'where param_key=\'tempDismissInterval\');'); SELECT @v_disable_temp; PREPARE sqlstr2 FROM @v_disable_temp; EXECUTE sqlstr2; DEALLOCATE PREPARE sqlstr2; -- END IF; SET @v_disable_temp_2 = concat_ws(' ', 'update ', v_table_name, 'set is_valid=false where (test_id in(select test_id from ', concat('temp_test_user_p', v_table_sub), ' where (max(latest_act_time )-now())> (select value_data from ', concat('platform_params_p', v_table_sub), 'where param_key=\'tempDismissInterval\'));'); SELECT @v_disable_temp_2; PREPARE sqlstr2 FROM @v_disable_temp; EXECUTE sqlstr2; DEALLOCATE PREPARE sqlstr2; END LOOP cursor_loop; CLOSE cursor_table_gis; COMMIT; -- END
本代碼涉及到的MySQL的內(nèi)容為
1.查詢表名
SELECT DISTINCT table_name tableName ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? FROM ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? information_schema.columns ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? WHERE ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? table_schema = 'testkaifa' ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? AND table_name LIKE '%temp_test_p_%';
2.執(zhí)行拼接的字符串SQL
PREPARE statement_name FROM sql_text /*定義*/? EXECUTE statement_name [USING variable [,variable...]] /*執(zhí)行預(yù)處理語句*/? DEALLOCATE PREPARE statement_name /*刪除定義*/
例如:
SET @v_disable_temp = concat_ws(' ', 'update ', v_table_name, 'set is_valid=false where (expire_time-now())> (select value_data from ', concat('platform_params_p', v_table_sub), 'where param_key=\'tempDismissInterval\');'); ? ? SELECT @v_disable_temp; ? ? PREPARE sqlstr2 FROM @v_disable_temp; ? ? EXECUTE sqlstr2; ? ? DEALLOCATE PREPARE sqlstr2;
批量更新語句(UPDATE)
使用UPDATE語句實現(xiàn)批量修改
示例
下面創(chuàng)建一個名為‘bhl_tes’的數(shù)據(jù)庫,并創(chuàng)建名為‘test_user’的表,字段分別為‘id’,‘age’,‘name’,’sex‘。
創(chuàng)建數(shù)據(jù)庫‘bhl_tes’
代碼
CREATE DATABASE IF NOT EXISTS bhl_test;
查看結(jié)果
創(chuàng)建表‘test_user’
代碼
CREATE TABLE IF NOT EXISTS `test_user`( `id` INT UNSIGNED AUTO_INCREMENT, `name` VARCHAR(255) NOT NULL, `age` INT(11) NOT NULL, `sex` VARCHAR(16), PRIMARY KEY ( `id` ) )ENGINE=InnoDB DEFAULT CHARSET=utf8;
查看結(jié)果
批量插入記錄
INSERT INTO test_user (name, age, sex) VALUES ('張三', 18, '男'), ('趙四', 17, '女'), ('劉五', 16, '男'), ('周七', 19, '女');
查看結(jié)果
批量修改記錄
UPDATE test_user SET name = CASE id WHEN 1 THEN '張三' WHEN 2 THEN '李四' WHEN 3 THEN '王五' WHEN 4 THEN '小六' END, age = CASE id WHEN 1 THEN 7 WHEN 2 THEN 8 WHEN 3 THEN 9 WHEN 4 THEN 14 END, sex = CASE id WHEN 1 THEN '男' WHEN 2 THEN '男' WHEN 3 THEN '男' WHEN 4 THEN '男' END WHERE id IN (1,2,3,4);
查看結(jié)果
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
淺談開啟magic_quote_gpc后的sql注入攻擊與防范
通過啟用php.ini配置文件中的相關(guān)選項,就可以將大部分想利用SQL注入漏洞的駭客拒絕于門外2012-01-01MySQL數(shù)據(jù)類型之淺談字符串(string)
這篇文章主要介紹了MySQL數(shù)據(jù)類型之字符串(string)的使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-10-10MySQL如何快速批量插入1000w條數(shù)據(jù)
這篇文章主要給大家介紹了關(guān)于MySQL如何快速批量插入1000w條數(shù)據(jù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03