【MySQL】数据表更新数据

在这里插入图片描述

个人主页:Guiat
归属专栏:MySQL

在这里插入图片描述

文章目录

  • 1. 数据更新基础
    • 1.1 更新操作的重要性
    • 1.2 更新语句基本结构
    • 1.3 更新操作注意事项
  • 2. 基本更新操作
    • 2.1 基本UPDATE语法
    • 2.2 使用表达式更新数据
    • 2.3 使用LIMIT限制更新行数
    • 2.4 NULL值处理
  • 3. 高级更新技术
    • 3.1 使用子查询更新数据
    • 3.2 多表更新
    • 3.3 条件更新与CASE表达式
    • 3.4 使用ORDER BY控制更新顺序
  • 4. 批量更新策略
    • 4.1 分批处理大规模更新
    • 4.2 使用临时表进行复杂更新
    • 4.3 使用事务确保一致性
  • 5. 高级条件更新
    • 5.1 基于聚合结果更新
    • 5.2 使用窗口函数(MySQL 8.0+)
    • 5.3 基于数据模式和异常值的更新
  • 6. 特殊数据类型的更新
    • 6.1 JSON数据更新(MySQL 8.0+)
    • 6.2 地理空间数据更新
    • 6.3 文本和BLOB类型更新
    • 6.4 加密数据更新
  • 7. 条件更新与验证
    • 7.1 使用条件逻辑防止不必要的更新
    • 7.2 基于当前值的条件更新
    • 7.3 使用触发器确保数据完整性
  • 8. 实际应用场景
    • 8.1 电子商务场景
    • 8.2 CMS内容管理
    • 8.3 用户管理系统
    • 8.4 系统维护和清理
  • 9. 性能优化
    • 9.1 更新性能优化技巧
    • 9.2 索引与更新性能
    • 9.3 批处理与大规模更新

正文

1. 数据更新基础

在MySQL中,更新数据是日常数据库操作中至关重要的一部分。理解如何正确高效地更新数据可以显著提升数据管理质量和应用性能。

1.1 更新操作的重要性

  • 保持数据的准确性和时效性
  • 响应业务变化的关键操作
  • 数据校正和规范化的必要手段
  • 系统状态维护的基础

1.2 更新语句基本结构

UPDATE语句
UPDATE子句
SET子句
WHERE子句
ORDER BY子句
LIMIT子句

1.3 更新操作注意事项

  • 始终使用WHERE子句限制范围(除非确实需要更新所有行)
  • 先用SELECT测试WHERE条件
  • 考虑事务以确保数据一致性
  • 注意约束和触发器的影响
  • 大规模更新时注意性能影响

2. 基本更新操作

2.1 基本UPDATE语法

-- 基本更新语法
UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;-- 更新单个列
UPDATE customers
SET email = 'new.email@example.com'
WHERE customer_id = 101;-- 更新多个列
UPDATE products
SET price = 29.99, stock = stock - 5, last_updated = NOW()
WHERE product_id = 1001;-- 条件更新
UPDATE employees
SET salary = salary * 1.05
WHERE department = 'Sales' AND performance_rating > 4;

2.2 使用表达式更新数据

-- 使用算术表达式
UPDATE order_items
SET quantity = quantity + 2,subtotal = quantity * unit_price
WHERE order_id = 5001;-- 使用内置函数
UPDATE users
SET username = LOWER(username),full_name = CONCAT(first_name, ' ', last_name),last_login = NOW()
WHERE user_id BETWEEN 1000 AND 2000;-- 使用CASE表达式
UPDATE products
SET status = CASEWHEN stock = 0 THEN 'Out of Stock'WHEN stock < 10 THEN 'Low Stock'ELSE 'In Stock'END
WHERE category_id = 5;

2.3 使用LIMIT限制更新行数

-- 限制更新的行数
UPDATE large_table
SET processed = TRUE
WHERE processed = FALSE
ORDER BY priority DESC, created_at ASC
LIMIT 1000;-- 分批更新大表中的数据
UPDATE customers
SET status = 'inactive'
WHERE last_activity < DATE_SUB(NOW(), INTERVAL 1 YEAR)
LIMIT 5000;

2.4 NULL值处理

-- 将NULL值更新为实际值
UPDATE contacts
SET phone = '000-000-0000'
WHERE phone IS NULL;-- 将空值更新为NULL
UPDATE product_details
SET description = NULL
WHERE description = '' OR description = 'N/A';-- 使用COALESCE提供默认值
UPDATE orders
SET shipping_address = COALESCE(shipping_address, billing_address, 'No address provided')
WHERE order_id > 10000;

3. 高级更新技术

3.1 使用子查询更新数据

-- 使用标量子查询更新数据
UPDATE products
SET price = price * 1.1
WHERE category_id = (SELECT category_id FROM categories WHERE name = 'Electronics');-- 使用相关子查询
UPDATE employees e
SET salary = salary * 1.03
WHERE salary < (SELECT AVG(salary) * 0.8FROM employeesWHERE department = e.department
);-- 使用EXISTS子查询
UPDATE customers
SET status = 'premium'
WHERE EXISTS (SELECT 1 FROM ordersWHERE orders.customer_id = customers.customer_idGROUP BY customer_idHAVING SUM(total_amount) > 10000
);

3.2 多表更新

-- 使用JOIN更新数据
UPDATE orders o
JOIN customers c ON o.customer_id = c.customer_id
SET o.status = 'priority'
WHERE c.customer_tier = 'gold' AND o.status = 'pending';-- 使用多表更新处理复杂业务逻辑
UPDATE products p
JOIN inventory i ON p.product_id = i.product_id
JOIN suppliers s ON i.supplier_id = s.supplier_id
SET p.price = p.price * 1.05,p.last_updated = NOW(),i.last_checked = NOW()
WHERE s.country = 'China' AND p.category = 'Electronics';-- 使用多表更新同步数据
UPDATE users u
JOIN temp_user_updates tu ON u.user_id = tu.user_id
SET u.email = tu.email,u.phone = tu.phone,u.address = tu.address,u.updated_at = NOW();

3.3 条件更新与CASE表达式

-- 使用CASE表达式进行复杂条件更新
UPDATE orders
SET shipping_fee = CASEWHEN total_amount > 100 THEN 0WHEN shipping_method = 'express' THEN 15WHEN shipping_method = 'standard' THEN 5ELSE shipping_feeEND,status = CASEWHEN payment_status = 'failed' THEN 'cancelled'WHEN inventory_status = 'backorder' THEN 'on hold'ELSE statusEND
WHERE order_date > '2023-01-01';-- 按照不同条件进行分组更新
UPDATE employees
SET bonus = CASEWHEN performance_rating = 5 THEN salary * 0.15WHEN performance_rating = 4 THEN salary * 0.10WHEN performance_rating = 3 THEN salary * 0.05ELSE 0
END
WHERE department = 'Sales' AND YEAR(hire_date) < 2023;

3.4 使用ORDER BY控制更新顺序

-- 按照指定顺序更新
UPDATE tasks
SET status = 'in_progress'
WHERE status = 'pending'
ORDER BY priority DESC, created_at ASC
LIMIT 5;-- 组合ORDER BY和LIMIT进行优先级更新
UPDATE support_tickets
SET assigned_to = 101
WHERE status = 'open' AND assigned_to IS NULL
ORDER BY CASE priorityWHEN 'high' THEN 1WHEN 'medium' THEN 2WHEN 'low' THEN 3END,created_at ASC
LIMIT 10;

4. 批量更新策略

4.1 分批处理大规模更新

-- 使用存储过程进行分批更新
DELIMITER //
CREATE PROCEDURE batch_update_records()
BEGINDECLARE done INT DEFAULT FALSE;DECLARE batch_size INT DEFAULT 5000;DECLARE total_updated INT DEFAULT 0;-- 开始事务START TRANSACTION;WHILE NOT done DO-- 更新一批数据UPDATE large_tableSET processed = TRUEWHERE processed = FALSELIMIT batch_size;-- 检查更新的行数SET total_updated = total_updated + ROW_COUNT();-- 如果没有行被更新,设置done为TRUEIF ROW_COUNT() = 0 THENSET done = TRUE;END IF;-- 提交当前批次COMMIT;-- 如果还有更多要处理,开始新事务IF NOT done THENSTART TRANSACTION;-- 可选:添加短暂延迟让系统呼吸DO SLEEP(0.1);END IF;END WHILE;SELECT CONCAT('Total updated: ', total_updated) AS result;
END //
DELIMITER ;-- 调用存储过程
CALL batch_update_records();

4.2 使用临时表进行复杂更新

-- 创建临时表存储要更新的记录ID
CREATE TEMPORARY TABLE temp_updates (id INT PRIMARY KEY,new_value VARCHAR(100)
);-- 填充临时表
INSERT INTO temp_updates (id, new_value)
SELECT id,CONCAT('Updated: ', some_field)
FROM main_table
WHERE complex_condition = TRUE
AND other_condition > 100;-- 使用临时表进行批量更新
UPDATE main_table m
JOIN temp_updates t ON m.id = t.id
SET m.some_field = t.new_value,m.updated_at = NOW();-- 清理
DROP TEMPORARY TABLE temp_updates;

4.3 使用事务确保一致性

-- 使用事务进行相关表的多个更新
START TRANSACTION;-- 更新订单状态
UPDATE orders
SET status = 'shipped',shipped_date = CURRENT_DATE
WHERE order_id = 12345;-- 更新库存
UPDATE inventory
SET stock_quantity = stock_quantity - (SELECT quantity FROM order_items WHERE order_id = 12345 AND product_id = inventory.product_id
)
WHERE product_id IN (SELECT product_id FROM order_items WHERE order_id = 12345);-- 添加发货记录
INSERT INTO shipments (order_id, tracking_number, carrier, shipped_date)
VALUES (12345, 'TRK123456789', 'FedEx', CURRENT_DATE);-- 如果一切正常,提交事务
COMMIT;-- 如果有错误,回滚
-- ROLLBACK;

5. 高级条件更新

5.1 基于聚合结果更新

-- 基于聚合结果更新客户等级
UPDATE customers c
JOIN (SELECT customer_id,SUM(total_amount) AS total_spentFROM ordersWHERE order_date > DATE_SUB(CURRENT_DATE, INTERVAL 1 YEAR)GROUP BY customer_id
) o ON c.customer_id = o.customer_id
SET c.customer_tier = CASEWHEN o.total_spent > 10000 THEN 'platinum'WHEN o.total_spent > 5000 THEN 'gold'WHEN o.total_spent > 1000 THEN 'silver'ELSE 'bronze'
END;-- 更新产品评级
UPDATE products p
JOIN (SELECT product_id,AVG(rating) AS avg_rating,COUNT(*) AS review_countFROM product_reviewsGROUP BY product_id
) r ON p.product_id = r.product_id
SET p.average_rating = r.avg_rating,p.review_count = r.review_count,p.featured = (r.avg_rating > 4.5 AND r.review_count > 10);

5.2 使用窗口函数(MySQL 8.0+)

-- 使用窗口函数更新员工排名
UPDATE employees e
JOIN (SELECT employee_id,RANK() OVER (PARTITION BY department ORDER BY performance_score DESC) AS dept_rankFROM employees
) r ON e.employee_id = r.employee_id
SET e.department_rank = r.dept_rank;-- 基于移动平均值更新产品价格波动
UPDATE product_price_history pph
JOIN (SELECT id,price,AVG(price) OVER (PARTITION BY product_id ORDER BY price_date ROWS BETWEEN 3 PRECEDING AND 3 FOLLOWING) AS avg_priceFROM product_price_history
) t ON pph.id = t.id
SET pph.price_volatility = ABS(pph.price - t.avg_price) / t.avg_price * 100
WHERE pph.price_date > '2023-01-01';

5.3 基于数据模式和异常值的更新

-- 更新异常值
UPDATE sensor_readings
SET reading_value = NULL, is_error = TRUE
WHERE reading_value < (SELECT AVG(reading_value) - (3 * STD(reading_value))FROM sensor_readingsWHERE sensor_id = sensor_readings.sensor_id)OR reading_value > (SELECT AVG(reading_value) + (3 * STD(reading_value))FROM sensor_readingsWHERE sensor_id = sensor_readings.sensor_id);-- 标记可疑交易
UPDATE transactions
SET flag_for_review = TRUE
WHERE amount > (SELECT AVG(amount) + (2 * STD(amount))FROM transactions AS tWHERE t.user_id = transactions.user_idAND t.transaction_date > DATE_SUB(CURRENT_DATE, INTERVAL 90 DAY)
);

6. 特殊数据类型的更新

6.1 JSON数据更新(MySQL 8.0+)

-- 更新JSON对象中的特定属性
UPDATE user_preferences
SET preferences = JSON_SET(preferences,'$.theme', 'dark','$.notifications.email', TRUE,'$.notifications.push', FALSE
)
WHERE user_id = 1001;-- 从JSON对象中移除属性
UPDATE product_meta
SET metadata = JSON_REMOVE(metadata,'$.deprecated_feature','$.old_pricing'
)
WHERE product_id IN (101, 102, 103);-- 向JSON数组追加值
UPDATE article_tags
SET tags = JSON_ARRAY_APPEND(tags,'$', 'new_feature'
)
WHERE article_id = 5001;-- 在JSON路径下替换数组元素
UPDATE user_settings
SET config = JSON_REPLACE(config,'$.favorites[0]', 'new_favorite'
)
WHERE user_id = 2001;

6.2 地理空间数据更新

-- 更新点位置
UPDATE locations
SET position = ST_GeomFromText('POINT(40.7128 -74.0060)')
WHERE location_id = 101;-- 更新区域边界
UPDATE territories
SET boundary = ST_GeomFromText('POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))')
WHERE territory_id = 5;-- 基于距离计算更新区域
UPDATE customer_locations
SET service_area = 'downtown'
WHERE ST_Distance(position,ST_GeomFromText('POINT(34.0522 -118.2437)')  -- Los Angeles downtown
) < 5000;  -- 5000米半径内

6.3 文本和BLOB类型更新

-- 更新长文本内容
UPDATE articles
SET content = CONCAT(content, '\n\nUpdated on ', NOW(), ': Additional information...'),word_count = LENGTH(content) - LENGTH(REPLACE(content, ' ', '')) + 1
WHERE article_id = 1001;-- 使用正则表达式替换文本内容
UPDATE product_descriptions
SET description = REGEXP_REPLACE(description,'old version|previous model','new version'
)
WHERE category = 'Electronics';-- 更新BLOB数据(通常通过编程语言API完成)
-- 示例伪代码:
/*
PREPARE stmt FROM "UPDATE documents SET file_data = ? WHERE document_id = ?";
EXECUTE stmt USING binary_data, document_id;
DEALLOCATE PREPARE stmt;
*/

6.4 加密数据更新

-- 使用MySQL内置加密函数更新敏感数据
UPDATE users
SET password_hash = SHA2(CONCAT('new_password', salt), 256),password_updated_at = NOW()
WHERE user_id = 101;-- 更新加密的信用卡信息
UPDATE payment_methods
SET card_number = AES_ENCRYPT('4111111111111111', @encryption_key),card_holder = 'John Smith',expiry_date = '2026-04'
WHERE payment_id = 501;-- 更新并使用内置函数加密敏感数据
UPDATE customers
SET ssn = TO_BASE64(AES_ENCRYPT('123-45-6789', @encryption_key)),data_encrypted = TRUE
WHERE customer_id = 1001 AND data_encrypted = FALSE;

7. 条件更新与验证

7.1 使用条件逻辑防止不必要的更新

-- 只在数据实际变化时更新
UPDATE products
SET name = 'New Product Name',price = 25.99,updated_at = NOW()
WHERE product_id = 101AND (name != 'New Product Name' OR price != 25.99);-- 使用行比较确保有变化
UPDATE customers
SET email = 'new.email@example.com',updated_at = NOW()
WHERE customer_id = 501AND (email, updated_at) != ('new.email@example.com', updated_at);

7.2 基于当前值的条件更新

-- 只更新满足特定条件的记录
UPDATE inventory
SET status = 'low_stock',needs_reorder = TRUE
WHERE product_id IN (101, 102, 103)AND quantity < reorder_thresholdAND status != 'discontinued';-- 基于计算结果的更新
UPDATE orders
SET total = subtotal + shipping_fee - discount,tax = (subtotal * tax_rate / 100),grand_total = (subtotal + shipping_fee - discount) + ((subtotal * tax_rate) / 100)
WHEREorder_status = 'pending'AND (total != subtotal + shipping_fee - discountOR tax != (subtotal * tax_rate / 100));

7.3 使用触发器确保数据完整性

-- 创建触发器验证更新数据
DELIMITER //
CREATE TRIGGER before_employee_update
BEFORE UPDATE ON employees
FOR EACH ROW
BEGIN-- 检查薪资变化不超过50%IF NEW.salary > OLD.salary * 1.5 THENSIGNAL SQLSTATE '45000'SET MESSAGE_TEXT = 'Salary increase cannot exceed 50%';END IF;-- 不允许降低薪资IF NEW.salary < OLD.salary THENSIGNAL SQLSTATE '45000'SET MESSAGE_TEXT = 'Salary cannot be decreased';END IF;-- 自动设置更新时间SET NEW.updated_at = NOW();
END //
DELIMITER ;-- 创建审计记录触发器
DELIMITER //
CREATE TRIGGER after_customer_update
AFTER UPDATE ON customers
FOR EACH ROW
BEGININSERT INTO customer_audit_log (customer_id,action,field_name,old_value,new_value,updated_by,update_time)SELECTNEW.customer_id,'UPDATE',column_name,old_value,new_value,CURRENT_USER(),NOW()FROM (-- 检查哪些字段发生了变化SELECT 'name' AS column_name, OLD.name AS old_value, NEW.name AS new_valueWHERE OLD.name <> NEW.name OR (OLD.name IS NULL AND NEW.name IS NOT NULL) OR (OLD.name IS NOT NULL AND NEW.name IS NULL)UNION ALLSELECT 'email', OLD.email, NEW.emailWHERE OLD.email <> NEW.email OR (OLD.email IS NULL AND NEW.email IS NOT NULL) OR (OLD.email IS NOT NULL AND NEW.email IS NULL)UNION ALLSELECT 'phone', OLD.phone, NEW.phoneWHERE OLD.phone <> NEW.phone OR (OLD.phone IS NULL AND NEW.phone IS NOT NULL) OR (OLD.phone IS NOT NULL AND NEW.phone IS NULL)) changed_columns;
END //
DELIMITER ;

8. 实际应用场景

8.1 电子商务场景

-- 更新产品库存
UPDATE products p
JOIN order_items oi ON p.product_id = oi.product_id
JOIN orders o ON oi.order_id = o.order_id
SET p.stock_quantity = p.stock_quantity - oi.quantity,p.last_sold_date = NOW()
WHERE o.order_id = 10001AND o.status = 'confirmed';-- 标记热门产品
UPDATE products p
JOIN (SELECT product_id, SUM(quantity) AS total_soldFROM order_itemsJOIN orders ON order_items.order_id = orders.order_idWHERE orders.order_date > DATE_SUB(CURRENT_DATE, INTERVAL 30 DAY)GROUP BY product_idHAVING total_sold > 50
) hot ON p.product_id = hot.product_id
SET p.is_hot_seller = TRUE,p.featured = TRUE;-- 客户升级
UPDATE customers c
JOIN (SELECT customer_id,COUNT(order_id) AS order_count,SUM(total_amount) AS total_spentFROM ordersWHERE order_date > DATE_SUB(CURRENT_DATE, INTERVAL 1 YEAR)GROUP BY customer_id
) o ON c.customer_id = o.customer_id
SET c.customer_tier = CASEWHEN o.total_spent > 5000 THEN 'platinum'WHEN o.total_spent > 2000 THEN 'gold'WHEN o.total_spent > 1000 THEN 'silver'ELSE c.customer_tierEND,c.lifetime_value = c.lifetime_value + o.total_spent
WHERE o.order_count > 0;

8.2 CMS内容管理

-- 更新文章阅读计数和热门标记
UPDATE articles
SET view_count = view_count + 1,is_trending = (view_count + 1 > 1000),last_viewed = NOW()
WHERE article_id = 501;-- 批量更新文章状态
UPDATE articles
SET status = 'published',published_date = NOW(),last_modified = NOW()
WHERE status = 'approved'AND scheduled_publish_date <= CURRENT_TIMESTAMP;-- 更新文章分类
UPDATE articles a
JOIN categories c ON a.primary_category_id = c.category_id
SET a.category_path = CONCAT(c.parent_path, '/', c.slug),a.last_modified = NOW()
WHERE c.parent_path != 'old_path';

8.3 用户管理系统

-- 用户登录状态更新
UPDATE users
SET last_login = NOW(),login_count = login_count + 1,last_ip = '192.168.1.100',status = 'active'
WHERE user_id = 1001;-- 批量禁用不活跃用户
UPDATE users
SET status = 'inactive',deactivated_at = NOW(),deactivation_reason = 'inactivity'
WHERE last_login < DATE_SUB(CURRENT_DATE, INTERVAL 1 YEAR)AND status = 'active';-- 用户账户升级
UPDATE user_subscriptions us
JOIN subscription_plans sp ON us.plan_id = sp.plan_id
SET us.status = 'active',us.current_period_start = CURRENT_DATE,us.current_period_end = DATE_ADD(CURRENT_DATE, INTERVAL sp.duration DAY),us.updated_at = NOW()
WHERE us.user_id = 2001AND us.plan_id = 3;

8.4 系统维护和清理

-- 清理旧日志
UPDATE system_logs
SET content = 'Content archived',archived = TRUE,archive_date = NOW()
WHERE log_date < DATE_SUB(CURRENT_DATE, INTERVAL 1 YEAR)AND archived = FALSE
LIMIT 10000;-- 批量删除标记
UPDATE temp_files
SET marked_for_deletion = TRUE,deletion_scheduled_at = DATE_ADD(CURRENT_DATE, INTERVAL 7 DAY)
WHERE created_at < DATE_SUB(CURRENT_DATE, INTERVAL 30 DAY)AND accessed_at < DATE_SUB(CURRENT_DATE, INTERVAL 15 DAY);-- 数据匿名化
UPDATE users
SET email = CONCAT('user_', user_id, '@anonymized.example'),phone = NULL,address = NULL,anonymized = TRUE,anonymized_at = NOW()
WHERE last_login < DATE_SUB(CURRENT_DATE, INTERVAL 3 YEAR)AND status = 'inactive'AND anonymized = FALSE;

9. 性能优化

9.1 更新性能优化技巧

-- 1. 确保WHERE子句中的列有索引
-- 创建索引提高WHERE条件性能
CREATE INDEX idx_last_activity ON users(last_activity);-- 2. 使用EXPLAIN分析更新语句
EXPLAIN UPDATE users
SET status = 'inactive'
WHERE last_activity < '2023-01-01';-- 3. 限制批量更新的记录数
UPDATE large_table
SET processed = TRUE
WHERE processed = FALSE
ORDER BY id
LIMIT 5000;-- 4. 使用更高效的操作符
-- 更高效:使用BETWEEN代替多个比较
UPDATE orders
SET status = 'archived'
WHERE order_date BETWEEN '2022-01-01' AND '2022-12-31';-- 5. 关闭约束检查(谨慎使用)
SET FOREIGN_KEY_CHECKS = 0;
-- 执行批量更新
UPDATE large_table SET ...;
SET FOREIGN_KEY_CHECKS = 1;

9.2 索引与更新性能

索引对更新的影响
提高性能
降低性能
加速WHERE条件评估
减少锁定的记录数
更新时需要维护索引
每个索引增加写入开销
可能导致页分裂

9.3 批处理与大规模更新

-- 创建临时表进行分析
CREATE TEMPORARY TABLE users_to_update AS
SELECT user_id
FROM users
WHERE last_login < DATE_SUB(CURRENT_DATE, INTERVAL 1 YEAR)
AND status = 'active';-- 创建索引加速后续更新
ALTER TABLE users_to_update ADD PRIMARY KEY (user_id);-- 分批处理更新
DELIMITER //
CREATE PROCEDURE batch_update_users()
BEGINDECLARE done INT DEFAULT FALSE;DECLARE batch_size INT DEFAULT 1000;DECLARE rows_affected INT;REPEAT-- 使用JOIN基于临时表更新UPDATE users uJOIN (SELECT user_idFROM users_to_updateLIMIT batch_size) AS batch ON u.user_id = batch.user_idSET u.status = 'inactive',u.updated_at = NOW();-- 获取影响的行数SET rows_affected = ROW_COUNT();-- 删除已处理的记录DELETE FROM users_to_updateORDER BY user_idLIMIT batch_size;-- 如果有更新,则休息一下再继续,避免长期锁定IF rows_affected > 0 THENDO SLEEP(0.1);END IF;UNTIL rows_affected = 0 END REPEAT;-- 清理DROP TEMPORARY TABLE IF EXISTS users_to_update;
END //
DELIMITER ;-- 执行批处理过程
CALL batch_update_users();

结语
感谢您的阅读!期待您的一键三连!欢迎指正!

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/bicheng/81059.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【更新】全国省市县-公开手机基站数据集(2006-2025.3)

手机基站是现代通信网络中的重要组成部分&#xff0c;它们为广泛的通信服务提供基础设施。随着数字化进程的不断推进&#xff0c;手机基站的建设与布局对优化网络质量和提升通信服务水平起着至关重要的作用&#xff0c;本分享数据可帮助分析移动通信网络的发展和优化。本次数据…

蓝桥杯12届国B 纯质数

题目描述 如果一个正整数只有 1 和它本身两个约数&#xff0c;则称为一个质数&#xff08;又称素数&#xff09;。 前几个质数是&#xff1a;2,3,5,7,11,13,17,19,23,29,31,37,⋅⋅⋅ 。 如果一个质数的所有十进制数位都是质数&#xff0c;我们称它为纯质数。例如&#xff1…

腾讯多模态定制化视频生成框架:HunyuanCustom

HunyuanCustom 速读 一、引言 HunyuanCustom 是由腾讯团队提出的一款多模态定制化视频生成框架。该框架旨在解决现有视频生成方法在身份一致性(identity consistency)和输入模态有限性方面的不足。通过支持图像、音频、视频和文本等多种条件输入&#xff0c;HunyuanCustom 能…

力扣top100 矩阵置零

开辟数组来标记元素为0的行和列&#xff0c;然后将对应的行和列的元素全部置为0&#xff1b; class Solution { public:void setZeroes(vector<vector<int>>& matrix) {int n matrix.size();int m matrix[0].size();vector<int> l(m),r(n);for(int i …

Python知识框架

一、Python基础语法 变量与数据类型 变量命名规则 基本类型&#xff1a;int, float, str, bool, None 复合类型&#xff1a;list, tuple, dict, set 类型转换与检查&#xff08;type(), isinstance()&#xff09; 运算符 算术运算符&#xff1a;, -, *, /, //, %, ** 比较…

华为OD机试真题——单词接龙(首字母接龙)(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现

2025 A卷 100分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…

微信小程序智能商城系统(uniapp+Springboot后端+vue管理端)

一、系统介绍 本智能商城系统是基于当今主流技术栈开发的一款多端商城解决方案&#xff0c;主要包括微信小程序前端、SpringBoot 后端服务以及 Vue 管理后台三大部分。系统融合了线上商城的核心功能&#xff0c;支持商品浏览、下单、支付、订单管理等操作&#xff0c;适用于中小…

Python笔记:c++内嵌python,c++主窗口如何传递给脚本中的QDialog,使用的是pybind11

1. 问题描述 用的是python 3.8.20, qt版本使用的是5.15.2, PySide的版本是5.15.2, pybind11的版本为2.13.6 网上说在python脚本中直接用PySide2自带的QWinWidget&#xff0c;如from PySide2.QtWinExtras import QWinWidget&#xff0c;但我用的版本中说没有QWinWidget&#x…

软考软件设计师中级——软件工程笔记

1.软件过程 1.1能力成熟度模型&#xff08;CMM&#xff09; 软件能力成熟度模型&#xff08;CMM&#xff09;将软件过程改进分为以下五个成熟度级别&#xff0c;每个级别都定义了特定的过程特征和目标&#xff1a; 初始级 (Initial)&#xff1a; 软件开发过程杂乱无章&#xf…

C# SQLite基本使用示例

目录 1 基本使用流程 1.1 步骤1&#xff1a;添加SQLite依赖 1.2 ​步骤2&#xff1a;建立连接 1.3 步骤3&#xff1a;执行SQL命令 1.4 步骤4&#xff1a;查询数据 1.5 步骤5&#xff1a;使用事务 2 SQLite基本使用示例 2.1 准备工作 2.2 完整示例 2.3 案例代码解析 …

视频图像压缩领域中 DCT 的 DC 系数和 AC 系数详解

引言 在数字图像与视频压缩领域&#xff0c;离散余弦变换&#xff08;Discrete Cosine Transform, DCT&#xff09;凭借其卓越的能量集中特性&#xff0c;成为JPEG、MPEG等国际标准的核心技术。DCT通过将空域信号映射到频域&#xff0c;分离出DC系数&#xff08;直流分量&…

对抗系统熵增:从被动救火到主动防御的稳定性实战

&#x1f4d5;我是廖志伟&#xff0c;一名Java开发工程师、《Java项目实战——深入理解大型互联网企业通用技术》&#xff08;基础篇&#xff09;、&#xff08;进阶篇&#xff09;、&#xff08;架构篇&#xff09;清华大学出版社签约作家、Java领域优质创作者、CSDN博客专家、…

java 中 DTO 和 VO 的核心区别

DTO 和 VO 的核心区别 特性DTO&#xff08;数据传输对象&#xff09;VO&#xff08;视图对象&#xff09;设计目的服务层与外部系统&#xff08;如前端、其他服务&#xff09;之间的数据传输为前端展示层定制数据&#xff0c;通常与 UI 强绑定数据内容可能包含业务逻辑需要的字…

数据结构【二叉树的遍历实现】

&#x1f4d8;考研数据结构基础&#xff1a;二叉树的存储、遍历与队列辅助实现详 在数据结构的学习中&#xff0c;二叉树作为一种结构清晰、应用广泛的树形结构&#xff0c;是考研计算机专业课中重点内容之一。本文将以实际代码为基础&#xff0c;介绍二叉树的存储结构、遍历方…

无人机俯视风光摄影Lr调色预设,手机滤镜PS+Lightroom预设下载!

调色详情 无人机俯视风光摄影 Lr 调色是利用 Adobe Lightroom 软件&#xff0c;对无人机从俯视角度拍摄的风光照片进行后期处理的调色方式。通过调整色彩、对比度、光影等多种参数&#xff0c;能够充分挖掘并强化画面独特视角下的壮美与细节之美&#xff0c;让原本平凡的航拍风…

【springcloud学习(dalston.sr1)】Eureka服务端集群的搭建(含源代码)(二)

该系列项目整体介绍及源代码请参照前面写的一篇文章【springcloud学习(dalston.sr1)】项目整体介绍&#xff08;含源代码&#xff09;&#xff08;一&#xff09; 这篇文章主要介绍多个eureka服务端的集群环境是如何搭建的。 &#xff08;一&#xff09;eureka的简要说明 Eu…

互联网大厂Java求职面试实战:Spring Boot微服务与数据库优化详解

&#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精通 &#x1f601; 2. 毕业设计专栏&#xff0c;毕业季咱们不慌忙&#xff0c;几百款毕业设计等你选。 ❤️ 3. Python爬虫专栏…

事件驱动reactor的原理与实现

fdset 集合&#xff1a;&#xff08;就是说&#xff09; fd_set是一个位图&#xff08;bitmap&#xff09;结构 每个位代表一个文件描述符 0表示不在集合中&#xff0c;1表示在集合中 fd_set结构&#xff08;简化&#xff09;&#xff1a; [0][1][2][3][4][5]...[1023] …

一分钟在Cherry Studio和VSCode集成火山引擎veimagex-mcp

MCP的出现打通了AI模型和外部数据库、网页API等资源&#xff0c;成倍提升工作效率。近期火山引擎团队推出了 MCP Server SDK&#xff1a; veimagex-mcp。本文介绍如何在Cherry Studio 和VSCode平台集成 veimagex-mcp。 什么是MCP MCP&#xff08;Model Context Protocol&…

掌控随心 - 服务网格的流量管理艺术 (Istio 实例)

掌控随心 - 服务网格的流量管理艺术 (Istio 实例) 想象一下,没有服务网格的时候,我们要实现像“将 1% 的用户流量导入到新版本应用”、“根据用户设备类型访问不同后端”、“模拟下游服务故障”这类高级流量策略,通常需要在代码、负载均衡器、API 网关等多个地方进行复杂且分…