2010-06-28 47 views
6

我试图检索一个表A的ID插入到另一个表B.我不能使用last_insert_id(),因为我没有插入任何东西到A.任何想法如何做到这一点好听?SELECT last id,without INSERT

$n = mysql_query("SELECT max(id) FROM tablename");似乎 没有工作,也没有

$n = mysql_query("SELECT max(id) FROM tablename GROUP BY id"); 
+0

什么引擎? mysql,mssql?访问? – masfenix 2010-06-28 15:26:10

+0

你的意思是“似乎不起作用”? – 2010-06-28 15:27:02

+0

定义“似乎不起作用”。什么不行?它返回什么?它应该是什么? – CaffGeek 2010-06-28 15:27:02

回答

15

在MySQL中,这确实从id列返回最高值:

SELECT MAX(id) FROM tablename; 

然而,这并没有把这个ID进入$n

$n = mysql_query("SELECT max(id) FROM tablename"); 

要获得该值,你需要这样做:

$result = mysql_query("SELECT max(id) FROM tablename"); 

if (!$result) { 
    die('Could not query:' . mysql_error()); 
} 

$id = mysql_result($result, 0, 'id'); 

如果你想从A中的最后一个插入ID,并将其插入到B,你可以用一个命令做到这一点:

INSERT INTO B (col) SELECT MAX(id) FROM A; 
0

我想补充时间戳记到每个记录并获得最新信息。在这种情况下,您可以获得任何ID,包装行和其他操作。

0

您可以get maximum column value and increment it

InnoDB使用下列算法来 初始化自动增长计数器 为包含 AUTO_INCREMENT名为ai_col列一个表t: 服务器启动后,第 插入到表t,InnoDB的执行 这一说法相当于:

SELECT MAX(ai_col) FROM t FOR UPDATE; 

InnoDB将由语句检索到的值 递增1,并将 分配给列的自动递增计数器并将其分配给表中的 。 如果表是空的,InnoDB使用的 值1

您也可以使用SHOW TABLE STATUS和它的“AUTO_INCREMENT”值。

+0

线程如何安全? – 2010-06-28 15:36:33

+0

“for update”表示表被锁定,直到选择结束才写入。当然,选择最大值并插入锁定这两个表的一个事务中会更好。 – silent 2010-06-28 15:39:25

+1

锁定写入?哎哟。 – 2010-06-28 16:10:23

0

你可以递减顺序按id的tabele和限制的结果数量一:

SELECT id FROM tablename ORDER BY id DESC LIMIT 1 

但是:ORDER BY重新排列整个表这一请求。所以如果你有很多的数据,你需要重复这个操作几次,我不会推荐这个解决方案。