2009-09-17 63 views
4
INSERT INTO details (idactivity,user,hours,val,date) VALUES ('981','133','0','10500','2008-07-01'),('981','184','0','2750','2008-07-01'),('981','184','0','2750','2008-07-01') 

(iddetails的详细信息表PK)我可以从批量插入中检索lastInsertId吗?

有没有办法来获得3个新iddetails和他们去一个新的批量插入查询?

INSERT INTO activity (idactivity,iddetails) VALUES('981',??),('981',??),('981',??) 

回答

2

据我所知,没有mysql

3

我认为你必须一次完成一个初始插入。 MySQL的last_insert_id只会给你使用多行插入语句插入的第一个元素的id。如果您有多个进程同时插入行,则可能会出现问题。

但是,(我还没有验证这一点,)如果你正使用InnoDB表,然后应该在一个隐式事务执行的语句,所以你应该能够假设生成的ID分别为顺序。

的另一种方式,再次,如果你有交易,是锁定表,并对其进行更新手动的AUTO_INCREMENT属性。例如,如果您要插入50行,然后将其填充50.然后解锁表格并插入行,明确使用您保留的ID。您需要为此转换(或至少表锁),以便不读取AUTO_INCREMENT,然后在更新之前让其他人插入新行。

+0

”应该能够认为生成的ID是连续的“ - 不是没有锁定桌面的拳头。 – symcbean 2011-09-09 11:20:56

5

还有就是behavior of last_insert_id() with multi-row insert statements在MySQL手册的详细讨论。用“重要”一词开头的红色垂直条部分向下滚动一点。

+0

链接不工作了 - 这里是正确的http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id – Horen 2012-10-10 14:32:04

+0

@霍伦我刚刚更新了链接到最新的文档(5.6)。我想知道他们为什么删除了5.4。 – Asaph 2012-10-10 15:59:04

0

如果您使用的日期时间,而不只是一个日期,你可以查找基于用户和datetime值插入的ID,但它可能是,如果你需要的数据更好,所以只是不能做批量插入。否则,你最终会运行更多的查询。

+0

不唯一 - CONNECTION_ID()会更好,但仍可能导致持久连接出现别名,除非与事务标志组合。 – symcbean 2011-09-09 11:19:51

0

您可以添加一个数据库字段的GUID并存储一个随机与每个记录。然后另一个查询可以提取的ID

-2

使用SELECT LAST_INSERT_ID();查询你可以得到最后插入的id。 “