gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 23:18:55 24 4
gpt4 key购买 nike

下面是一些示例代码:

$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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com