php - 查询失败后,ID 仍在数据库中递增

标签 php sql sql-server database

下面是一些示例代码:

$sql = "INSERT INTO Users (Firstname,Surname) VALUES ('$firstname', '$surname')";

$stmt = sqlsrv_query( $conn, $sql,array(), array( "Scrollable" => SQLSRV_CURSOR_KEYSET ));
if(!$stmt) 
{
die('Yu feiru!');
}

数据库中有3列;身份证、名字和姓氏。 ID 是一个自增主键。我也有名字作为唯一键。所以,既然我已经全面了解了这一切,那么一切都可以解释我的问题。

当我的表单完成后,它会转到执行上述代码的页面。现在,最初这是可行的,因为它应该如此,所以现在我将在表中拥有 ID 为 1 的第一条记录。现在,如果我要刷新此页面,它会返回一个错误,这显然是因为我插入了相同的firstname,因为它是一个唯一的键,所以它不会起作用,到目前为止一切顺利。

这就是问题所在,如果我现在返回表单并提交新的详细信息,新记录显示的 ID 为 3。所以问题就在这里,每次运行查询时,是否成功与否,它会增加 ID。所以之前,如果我刷新页面 5 次,那么新记录的 ID 将是 7。

编辑:请注意,正如我所说,这只是示例代码。我仍然没有对 SQL 注入(inject)采取任何预防措施。不管怎样,非常感谢您的建议。

最佳答案

我可以给你一个可能的解决方案。但是:首先,你想要那个的理由很少。 ID 的目的只是为了识别,而不是提供可靠的唯一序列。如果你想要一个无间隙的唯一序列,你可以用其他方式自己做。

也就是说,添加这个触发器:

CREATE TRIGGER IdentityFixer
   ON  dbo.YourTable
   AFTER INSERT
AS 
BEGIN
declare @NextID bigint
set @NextID = (select MAX(MyID) from dbo.YourTable)
DBCC CHECKIDENT ("dbo.YourTable", RESEED, @NextID);
END
GO

将完美解决您所说的“问题”(在 Microsoft SQL Server 中)。您可以插入并失败 1000 次,但您的 ID 仍然是无缝的。我不推荐这个。

关于php - 查询失败后,ID 仍在数据库中递增,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9165638/

相关文章:

php - Silex:使用 Flash 数据重定向

mysql - 使用多个 AND 优化连接查询的最佳方法是什么?

php - 基于从 ajax 调用返回的获取变量构建查询

sql-server - 为什么使用 "fake table"ObjectProperty 确定某些系统表为 "TableIsFake"?

sql-server - 如何优化 T-SQL 存储过程以搜索源表并将新记录插入目标表

php - 使用WebSocket通信保存数据

php - 通过循环 AJAX 或服务器端调用繁重的 PHP 函数

sql - rails : Convert a complex SQL query to Arel or ActiveRecord

sql - 高效地遍历每一行?

php - jQuery 文件上传 'undefined' 图片 url