2010-07-29 65 views
1

生成的ID我想要执行的形式的查询:恢复从多个插入查询

INSERT INTO表(FIELD1,FIELD2)SELECT FIELD1,FIELD2 FROM表WHERE ID。在(4,8,15,16, 23,42)

其中,id是table的auto_increment主键。

执行这个语句后,我想知道刚才生成的所有新ID是什么。我怎样才能恢复这些信息?我感兴趣的是(可能)在存储过程中这样做,并将新生成的ID列表返回给我的应用程序代码(可以说PHP),我希望列表与IN子句中出现的内容相关的SELECT子查询。我认为这会为我在应用程序代码中节省大量顺序INSERT。这是可以实现的吗?

回答

3

如果你有控制表(或可以创建另一个表)如何存储“transaction_id?”

如果您添加到您的表,你可以做这样的事情:

Declare @tranId int 
Select @tranId = Max(transaction_id) + 1 from [table] 
Insert Into [table] (field1, field2, transactionId) 
Select field1, field2, @tranId 
From //the rest of your query 

你会再拔出新的ID:

Select Id from [table] where transaction_id = @tranId 

作为一个说明,你会或者需要立即运行该查询作为存储过程的一部分,或者需要存储您在某处使用的transactionId,以便您可以拔出正确的行而不用担心多个并发插入操作。

+0

做一个重写到MySQL,你可能有一个点:) – Wrikken 2010-07-29 21:54:59

+0

当它完全错过了MySql标签。不知道如何...虽然唯一不会通用的大多数品种的Sql将是Max()的调用,我会认为... – AllenG 2010-07-29 21:58:08

+0

然而,这是一个有趣的答案...如果我只是保留了一个只有id字段的虚拟表,然后有人希望执行这种查询,可以首先对虚拟表进行插入操作,从中可以恢复插入标识,从而成为它们的transaction_id“ticket”。然后我可以在INSERT INTO ... SELECT语句中选择它作为常量。只要插入发生“按顺序”,我应该随后可以通过在我的事务标签上按SELECT排序来恢复它们......想法? – vicatcu 2010-07-29 22:04:40

3

我不这么认为。至少不是以可靠的方式。 LAST_INSERT_ID()将从扩展插入中返回第一个自动生成的ID。您可以假定在插入过程中插入的内容都高于此值,但在许多情况下这可能是错误的(特别是一次有多个人在处理数据库时)。

+0

确实无法可靠工作。在一个存储过程中,你可以用一个光标在select上循环,做单个插入。 – Wrikken 2010-07-29 21:44:15

+0

@Wrikken - 是的,如果他们是Eeeeevillll! ;) – AllenG 2010-07-29 21:46:20

+0

会比从我的应用程序代码(即通过网络)顺序发出查询快得多吗? – vicatcu 2010-07-29 21:46:23

0

你只能得到最后插入ID,但你可以得到受影响的行...

所以IDS将

$ids = range($lastID - (--$rows), $lastID); 

- $行,只要你想保持过去的ID太。

例如。最后一个插入是18和3排受到影响,因此16,17,18将是你的id,但是18-3会产生15,因此给出15,16,17,18,这将是错误的!

+0

可以说你有更多像8000行受到影响... – vicatcu 2010-07-29 21:48:56

+0

也是如此...... – 2010-07-30 08:22:27

+0

我认为问题在于你无法保证插入的发生不会中断......所以我不能保证有顺序auto_increment id的生成没有中断。 – vicatcu 2010-08-02 15:15:58