mysql 拷贝表锁表吗,mysql - 如何从另一个表拷贝数据,而无需在MYSQL6.2锁表? - SO中文参考 - www.soinside.com...

为了减少使用OFFSET的缺点,this article描述使用JOIN当一个数字主键id可强制使用适当的指数的可能途径。需要注意的是跟踪过程中,一个“procedure_log”表中创建并逐步处理了一批又更新:

对于MySQL:

DROP PROCEDURE IF EXISTS copyTable;

DELIMITER |

CREATE PROCEDURE copyTable()

BEGIN

DECLARE batchSize INT DEFAULT 100;

DECLARE i INT DEFAULT 0;

DECLARE rowCount INT;

# Note that we use a WHERE clause to prevent a full table scan / use the index properly

SET rowCount = (SELECT COUNT(id) FROM my_table WHERE id IS NOT NULL);

CREATE TABLE IF NOT EXISTS my_table_copy LIKE my_table;

CREATE TABLE IF NOT EXISTS procedure_log ( id INT UNSIGNED NOT NULL AUTO_INCREMENT, entry TEXT, timestamp DATETIME DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id) );

WHILE i <= rowCount DO

INSERT IGNORE INTO my_table_copy (

SELECT source.* FROM (

SELECT id FROM my_table ORDER BY id LIMIT i, batchSize

) tmp

JOIN my_table source ON source.id = tmp.id

ORDER BY source.id

);

SET i = i + batchSize;

INSERT INTO procedure_log (entry) VALUES (CONCAT('Copied batch from my_table => my_table_copy, batch: ', batchSize, ', offset: ', i, ', rowCount: ', rowCount));

END WHILE;

END |

DELIMITER ;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值