使用mysql_insert_id插入大量数据

Posted

技术标签:

【中文标题】使用mysql_insert_id插入大量数据【英文标题】:Using mysql_insert_id to insert a lot of data 【发布时间】:2010-09-14 23:16:21 【问题描述】:

我想使用 phpmysql 将数据插入数据表及其关联的多对多表中。数据表的自增主ID用于多对多表。因此,我需要知道要插入多对多表的数据表的 ID。

我目前的想法是,最好的方法是使用循环,首先插入数据表,然后使用 mysql_insert_id() 插入多对多表。这是解决这个问题的最佳方式吗?

此外,我是否需要担心使用该函数获取错误的 ID?许多工作人员会同时使用这个数据脚本,所以我担心来自一个工作人员查询的 ID 最终会在调用另一个工作人员的 mysql_insert_id() 时返回。这是一个有效的问题吗?如果是,我该如何处理?

【问题讨论】:

您要插入的数据来自哪里?它可能有助于定义我们可以使用哪些类型的查询 mysql_insert_id() 不会返回另一个线程的最后插入 ID,因此您的方法将是多进程安全的。 【参考方案1】:

在具有 auto_increment id 的表上调用 mysql_insert_id() 是正确的方法。

只要在调用mysql_query() 插入行之后直接调用mysql_insert_id(),就不用担心得到错误的id。 PHP 和 MySQL 会为您处理这一切。

【讨论】:

【参考方案2】:

如果你可以锁定表。

LOCK TABLE myTable FOR WRITE;
SELECT MAX(id) FROM myTable;
INSERT....
INSERT....
INSERT....
SELECT MAX(id) FROM myTable;
UNLOCK TABLES;

这将阻止其他人对 myTable 进行任何操作,但您的 id 将具有最小/最大范围。

-丹尼尔

【讨论】:

-1: a) 正如 Gus 和 staticsan 所指出的,mysql_insert_id 已经是线程安全的。 b)这将是性能消耗或没有理由。这个问题意味着多线程访问。 c) 使用 MAX(id) 是个坏主意。尽管自动递增的 ID 通常定义为 MAX(column)+1,例如在 MyISAM 中,但出于可移植性的原因,您不应依赖它。 d)这个问题意味着需要每个插入的结果,而不仅仅是最后一个插入。 b) 表可以锁定一小段时间。 c) 是的,就可移植性而言,MAX(id) 是个坏主意,但谁会更改数据库?这是一个罕见的事件。 d) 结果是从开始 SELECT MAX(id) 到结束 SELECT MAX(id) 的所有插入值。 -1:对自己。我应该更仔细地阅读这个问题。 :)

以上是关于使用mysql_insert_id插入大量数据的主要内容,如果未能解决你的问题,请参考以下文章

在单个查询中将 SQL 关系插入到 2 个表,而不使用 mysql_insert_id()

转://使用insert插入大量数据的总结

Grails,使用 withTransaction 插入大量数据会导致 OutOfMemoryError

Mysql插入大量随机数据

需要使用实体框架将大量记录插入数据库

什么相当于 mysql_insert_id();使用准备好的语句?