我目前正在开发一个使用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也会持续几分钟。
答案 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()
变量,并且不会干扰第一个。
简而言之,只要INSERT
和LAST_INSER_ID()
请求在同一个脚本中发生(并且您不以某种方式关闭它们之间的数据库连接),它们就完全安全了,您的脚本专门使用该连接。