【发布时间】:2011-09-16 20:53:25
【问题描述】:
在 INSERT 语句之后插入整个行的最简单/最有效的方法是什么?
我很确定我可以这样做:
$aQuery = "INSERT into myTable (a, b, c) VALUES (1, 'Hello', 'Goodbye')";
//the IDENTITY coloumn in myTable is named id
$result = sqlsrv_query($myConn, $aQuery );
if ($result) {
$res = sqlsrv_query('SELECT LAST_INSERT_ID()');
$row = sqlsrv_fetch_array($res);
$lastInsertId = $row[0];
$subQuery = "SELECT * FROM myTable where id = {$lastInsertId}";
$subResult = sqlsrv_query($myConn, $subQuery);
if ($subResult) {
while($subrow = sqlsrv_fetch_array($subResult)) {
echo($subrow ['id'] . ', '.
$subrow ['a'] . ', '.
$subrow ['b']); //etc...
}
}
}
但是,我担心 another 插入发生在我的 SELECT LAST_INSERT_ID() 之前的可能性,从而扰乱了我的启动逻辑。我如何确定最后插入的 id 确实是我之前调用的 INSERT,而不是其他地方发生的事情?
有没有更合适的方法,也许是一个完整的 SQL 解决方案(这样查询会自动返回行而不是使用 PHP)?
更新:myTable DOES 有一个明确定义(且自动递增)的标识列,名为 id。
【问题讨论】:
-
你的担心很不现实。
-
然而由于糟糕的设计每天都在发生。如果您有 1 个人使用该系统,则永远不会发生。但是当你有 100 个人同时使用同一个系统时,几率会突然急剧增加。 OP 是正确的,让它成为一个关注点并提前思考。
-
@Andrey - 我的想法完全正确。感谢您的备份。
-
@stevether 他们并非不切实际,恰恰相反。我支持一个只有几个用户(大约 40 个)的系统,并且仅仅因为 @@identity 被多次使用,错误的记录最终被更新。
标签: php sql-server sql-server-2005