关系数据库表中的记录本质上是无序的。
因此,您可以简单地创建一个包含 @First 和 @Last (在您的情况下为 0 和 9999)之间的所有值的表,然后在从该表中选择时使用随机顺序。您也可以在数据库表中使用一个简单的 int,然后在从表中选择数据时对其进行格式化。
由于我的主数据库是 Sql server,而且我没有使用 sqlite 的经验,我将在我的代码示例中使用 Sql Server 语法,并留给你找到 sqllite 等效项。
首先,创建表:
CREATE TABLE Tbl
(
IntValue int PRIMARY KEY,
IsUsed bit NOT NULL DEFAULT 0
)
然后,用 0 到 9999 之间的数字填充它:
;With CTE AS (
SELECT 0 As IntValue
UNION ALL
SELECT IntValue + 1
FROM CTE
WHERE IntValue + 1 < 10000
)
INSERT INTO Tbl (IntValue)
SELECT IntValue
FROM CTE
OPTION(MAXRECURSION 0)
然后,你想每次选择多个值,所以我会写一个这样的存储过程:
CREATE PROCEDURE stp_GetCouponCodes
(
@Number int = 5 -- or whatever number is default
)
AS
BEGIN
DECLARE @UsedValues AS TABLE
(
IntValue int
)
BEGIN TRY
BEGIN TRANSACTION
INSERT INTO @UsedValues
SELECT TOP(@Number) IntValue
FROM Tbl
WHERE IsUsed = 0
ORDER BY NEWID()
UPDATE Tbl
SET IsUsed = 1
FROM Tbl
INNER JOIN
@UsedValues uv ON(Tbl.IntValue = uv.IntValue)
SELECT RIGHT('00000' + CAST(IntValue as varchar), 5)
FROM @UsedValues
COMMIT TRANSACTION
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION
END CATCH
END
然后,当您想要生成优惠券时,只需使用您想要的优惠券数量执行存储过程:
EXEC stp_GetCouponCodes 10;
See working fiddle example here.