php - 插入期间最小化 autoinc id 间隙,如何?

标签 php mysql

我有一个工作表,可以慢慢收集信息,比如表 A1、A2、A3。

时不时地,我需要将新信息从表 A1、A2、A3 复制到表 B1、B2、B3 中。这些表相当大(约 20000 行)。

A1、A2、A3 表使用 GUID,而 B1、B2、B3 表则使用 AUTO_INCRMENT id。

由于尺寸的原因,插入的批量为 300 个。

如果其中一个插入失败,那么所有其他表也不得插入数据,因此我将所有查询放入一个事务中。

本文中提到的解决方案似乎有效:http://mysql.rjweb.org/doc.php/datawarehouse

除了文章特别提到这不应该在事务内完成(据我所知,这是我无法做到的)

This INSERT..SELECT must not be done inside the transaction with the rest of the processing. Otherwise, you add to deadlock risks, leading to burned ids.

我也考虑过使用 INSERT IGNORE 和 innodb_autoinc_lock_mode=0 但我无法使用 PDO 设置 innodb_autoinc_lock_mode,它只是给出错误:

SQLSTATE[HY000]: General error: 1238 Variable 'innodb_autoinc_lock_mode' is a read only variable'

弄清楚如何使用 PDO 设置 innodb_autoinc_lock_mode 可以解决这个问题,但我无法做到这一点。

仅仅执行INSERT IGNORE INTO B1 SELECT FROM A1并忽略间隙听起来也很诱人,但是表太大,autoinc id很快就达到了大小限制

我已经为此苦苦挣扎了好几个星期,只要间隙不增加得这么快,我不介意。 有人对解决这个问题的最佳方法有建议吗?

最佳答案

but the tables are too large and the autoinc id quickly reaches the size limit

事实并非如此。

如果每秒插入一条新记录,70年后就会达到极限。即使这个限制可以延长,但怀疑是否有任何必要。

所以,不要介意间隙并以通常的方式插入。

而且 - 更多的是 - 永远不要为自动增量而烦恼。这不是必须保持秩序的东西。

关于php - 插入期间最小化 autoinc id 间隙,如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19619114/

相关文章:

php - 如何使用 FPDF 显示多个动态行?

java - 从 Mysql 中检索并在 JSP 中显示数据

javascript - 使用 php 和 javascript 进行 AJAX 即时检查

php - 使用 ajax/jquery 检索最后一个 mysql rowd ID

php - 为什么此urlencode JSON GET请求不起作用?

php - 如何将.sql表文件导入到mysql表

php - 我该如何解决这个由 if 语句引起的奇怪的 PHP/MySQL 问题?

java - 如何提取和比较 HttpPost 响应字符串?

php - 有没有办法自动调整数据库名、用户名和密码

mysql - 避免在 MySQL 脚本中重复语句