SQL 服务器随机插入
SQL Server Insert Random
我有这个 table:
Create Table Person
(
Consecutive Integer Identity(1,1),
Identification Varchar(15) Primary Key,
)
Identification栏可以包含字母,数字,是可选的,即客户可以输入也可以不输入,如果不输入则自动创建一个数字..如何插入一个不存在的随机数之前?,最好是较小的数字。
例如:
Select Random From Person Where Random Not Exists In Identification
这是我的代码:
Select Min(Convert(Integer,Identification)) - 1
From Person
Where IsNumeric(Identification) = 1
或
Select Max(Convert(Integer,Identification)) + 1
From Person
Where IsNumeric(Identification) = 1
效果很好,但如果客户输入的数字很大,例如 1000 或更高,那么数字将从那里开始,可能会出现溢出错误
但如果没有低于 Identification 且大于 0 的数字,则可以为 -1、-2、-3 等
提前致谢..
维护 VARCHAR(15) 的随机数,这取决于最终用户的输入,当您还希望它是唯一的时,这可能是一种非常昂贵的方法。
想象一个场景,当你有相当数量的行时,比如在这个 table 中有 10,000 行,并且用户进来试图插入一个随机数,用户可能会尝试 5、10 甚至可能15 次得到唯一的随机值。
每次尝试失败时,将调用服务器,将在 table 上进行搜索(此查询的行数越多,成本越高),并且用户进行的(失败)尝试次数越多disappointment/poor 用户将拥有的应用程序体验。
您是否会回到一个应用程序(web/windwos),在那里您只是为了注册而奋斗了这么多次?明显不是。
这个故事的寓意是,如果您要求用户输入一些随机值,不要指望用户维护您的数据库完整性并保持该列的唯一性,控制并将该值与另一列配对,这肯定会是随机的。在您的情况下,它可以是身份列。或者您可以使用 guid 自己为用户生成该值。
我同意M.Ali所说的。但是你可以只使用下面的代码,但我仍然不推荐超出 M.Ali 所说的内容。
循环继续,直到生成一个不在您的 table 中的随机数。您可以通过将 1000
更改为 10000
等将精度更改为 5 位数字。
DECLARE @I INT = 0
DECLARE @RANDOM INT;
WHILE(@I=0)
BEGIN
SELECT @RANDOM = 1000 + (CONVERT(INT, CRYPT_GEN_RANDOM(3)) % 1000);
IF NOT EXISTS(SELECT Identification FROM YOURTABLE WHERE Identification = CAST(@RANDOM AS VARCHAR(4)))
BEGIN
-- Do your stuff here
BREAK;
END
ELSE
BEGIN
-- The ELSE part
END
END
select count(*) +1 from Person
这会为 Identification
生成一个逻辑 ID,它使用一个简单的增量器将 ID 设置为它 'would have been' 的值。
但是,您不能删除记录;相反,您必须停用它们,或清除该行。
或者,有一个仅自动递增的单独(隐藏)列,如果 Identification
留空,则使用隐藏列中的值。结果相同,但如果删除相关则风险较小。
我有这个 table:
Create Table Person
(
Consecutive Integer Identity(1,1),
Identification Varchar(15) Primary Key,
)
Identification栏可以包含字母,数字,是可选的,即客户可以输入也可以不输入,如果不输入则自动创建一个数字..如何插入一个不存在的随机数之前?,最好是较小的数字。
例如:
Select Random From Person Where Random Not Exists In Identification
这是我的代码:
Select Min(Convert(Integer,Identification)) - 1
From Person
Where IsNumeric(Identification) = 1
或
Select Max(Convert(Integer,Identification)) + 1
From Person
Where IsNumeric(Identification) = 1
效果很好,但如果客户输入的数字很大,例如 1000 或更高,那么数字将从那里开始,可能会出现溢出错误
但如果没有低于 Identification 且大于 0 的数字,则可以为 -1、-2、-3 等
提前致谢..
维护 VARCHAR(15) 的随机数,这取决于最终用户的输入,当您还希望它是唯一的时,这可能是一种非常昂贵的方法。
想象一个场景,当你有相当数量的行时,比如在这个 table 中有 10,000 行,并且用户进来试图插入一个随机数,用户可能会尝试 5、10 甚至可能15 次得到唯一的随机值。
每次尝试失败时,将调用服务器,将在 table 上进行搜索(此查询的行数越多,成本越高),并且用户进行的(失败)尝试次数越多disappointment/poor 用户将拥有的应用程序体验。
您是否会回到一个应用程序(web/windwos),在那里您只是为了注册而奋斗了这么多次?明显不是。
这个故事的寓意是,如果您要求用户输入一些随机值,不要指望用户维护您的数据库完整性并保持该列的唯一性,控制并将该值与另一列配对,这肯定会是随机的。在您的情况下,它可以是身份列。或者您可以使用 guid 自己为用户生成该值。
我同意M.Ali所说的。但是你可以只使用下面的代码,但我仍然不推荐超出 M.Ali 所说的内容。
循环继续,直到生成一个不在您的 table 中的随机数。您可以通过将 1000
更改为 10000
等将精度更改为 5 位数字。
DECLARE @I INT = 0
DECLARE @RANDOM INT;
WHILE(@I=0)
BEGIN
SELECT @RANDOM = 1000 + (CONVERT(INT, CRYPT_GEN_RANDOM(3)) % 1000);
IF NOT EXISTS(SELECT Identification FROM YOURTABLE WHERE Identification = CAST(@RANDOM AS VARCHAR(4)))
BEGIN
-- Do your stuff here
BREAK;
END
ELSE
BEGIN
-- The ELSE part
END
END
select count(*) +1 from Person
这会为 Identification
生成一个逻辑 ID,它使用一个简单的增量器将 ID 设置为它 'would have been' 的值。
但是,您不能删除记录;相反,您必须停用它们,或清除该行。
或者,有一个仅自动递增的单独(隐藏)列,如果 Identification
留空,则使用隐藏列中的值。结果相同,但如果删除相关则风险较小。