mySQL的“last_update_ID()”有替代方法吗?

时间:2010-12-04 15:39:28

标签: mysql

我目前正在开发一个使用ASP和MySQL的大型Web项目。 当我插入多个表时,我一直在使用last_update_ID(),但经过一些研究后我发现SQL语句不安全。

因此。问题: 我使用两台不同的计算机,具有不同的互联网连接 两台计算机都登录到我正在构建的系统。我创建了一个打印connection_id()和last_update_id的页面 如果我用其中一台计算机更新任何表,另一台也会获得last_update_ID。 两台计算机都具有相同的connection_ID。

我该怎么做才能解决这个问题?

我不想(如果没有必要)在第一次INSERT之后执行select语句;搜索我插入的行,以获取该行的正确ID。

这不是我使用的服务器,因此无法对数据库进行任何大的更改 我想这个问题的出现是因为网页使用相同的loginName&用于连接数据库的密码,是真的吗?

还有其他替代方法可以获取最新的更新ID吗?那是完全安全的.. 我关闭了asp页面末尾的每个连接。但这不会改变connection_ID 即使您在服务器上打开不同的网页,连接ID也会持续几分钟。

2 个答案:

答案 0 :(得分:3)

我认为LAST_INSERT_ID()对于当前会话是正确的。因此每个会话都会收到它自己的正确值。要么我不理解你的问题,要么你认为你有问题,但你没有。

我不知道任何LAST_UPDATE_ID()函数,在更新中,您可以通过使用相同的WHERE子句(在更新之前)选择它们来轻松检索更新的行吗?

参考:http://dev.mysql.com/doc/refman/5.0/en/getting-unique-id.html

  

对于LAST_INSERT_ID(),最多   最近生成的ID保留在   服务器基于每个连接。   它不会被其他客户更改。   如果你更新,它甚至没有改变   另一个带有的AUTO_INCREMENT列   非神经价值(即一个值   不是NULL而不是0)。运用   LAST_INSERT_ID()和AUTO_INCREMENT   同时从多个列   客户完全有效。每   客户端将收到最后插入的   最后一个语句的ID   客户执行。


如果要从带有ON DUPLICATE KEY UPDATE子句的INSERT查询中检索LAST_INSERT_ID,还可以使用LAST_INSERT_ID()函数检索已更新的AUTO_INCREMENT列的值:

参考:http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

  

如果表包含AUTO_INCREMENT   列和INSERT ... UPDATE插入一个   行,LAST_INSERT_ID()函数   返回AUTO_INCREMENT值。如果   该语句更新了一行,   LAST_INSERT_ID()没有意义。   但是,你可以解决这个问题   使用LAST_INSERT_ID(expr)。假设   该id是AUTO_INCREMENT列。   使LAST_INSERT_ID()有意义   对于更新,插入行如下:

INSERT INTO table (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), c=3;

答案 1 :(得分:1)

您的服务器似乎已打开连接池。这意味着数据库连接在脚本完成后保持打开状态,并且下一个脚本使用它,因此可以看到在该连接上设置的任何变量,包括LAST_INSERT_ID()

不可能发生的是两个同时共享连接的脚本实例。因此,如果您的服务器忙于需要在完全相同的时间运行两个脚本实例,它将只创建第二个数据库连接,具有自己独立的LAST_INSERT_ID()变量,并且不会干扰第一个。

简而言之,只要INSERTLAST_INSER_ID()请求在同一个脚本中发生(并且您不以某种方式关闭它们之间的数据库连接),它们就完全安全了,您的脚本专门使用该连接。