使用mysql_insert_id插入大量数据
Posted
技术标签:
【中文标题】使用mysql_insert_id插入大量数据【英文标题】:Using mysql_insert_id to insert a lot of data 【发布时间】:2010-09-14 23:16:21 【问题描述】:我想使用 php 和 mysql 将数据插入数据表及其关联的多对多表中。数据表的自增主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()