【发布时间】:2012-06-06 22:09:19
【问题描述】:
我想在名为 accounts 的表中插入数据,其中一个字段必须有一个随机数,从 11 开始,长度为 9 位,例如 112345673 或 119876543。这可以通过 SQL 实现还是我必须这样做这个在PHP中然后插入那里?
【问题讨论】:
-
您需要一个唯一的随机数,还是任何随机数都可以?
标签: php sql sql-server tsql
我想在名为 accounts 的表中插入数据,其中一个字段必须有一个随机数,从 11 开始,长度为 9 位,例如 112345673 或 119876543。这可以通过 SQL 实现还是我必须这样做这个在PHP中然后插入那里?
【问题讨论】:
标签: php sql sql-server tsql
如果您一次插入一行...
--INSERT dbo.table(column1, random_column)
SELECT 'column1_value',
'11' + RIGHT(REPLACE(CONVERT(VARCHAR(12), RAND()), '.', ''), 3)
+ RIGHT(REPLACE(CONVERT(VARCHAR(12), RAND()), '.', ''), 4);
如果这是多行 SELECT 的一部分,您将看到分配给每一行的相同数字,因此您需要根据每行中的其他数据进行随机化(或使用康拉德指出的 NEWID()),例如
--INSERT dbo.table(column1, random_column)
SELECT name, '11' + RIGHT(1000000 + ABS(CONVERT(BIGINT,
CONVERT(VARBINARY(16), NEWID()))), 7)
FROM sys.all_objects;
(我已将INSERT 注释掉,因此您可以独立测试结果。)
【讨论】:
NEWID() 已经有了另一个答案,所以我想我会提供一种稍微不同的方法。
newid(),但有类似的 uuid() 功能
这会给你一个 11 位的随机数。如果随机数小于 9 位,则以 0 为前缀,因此总长度始终为 11:
select '11' + right('11000000000' +
cast(abs(convert(bigint,convert(varbinary(8),newid()))) as varchar(20)), 9)
【讨论】:
也许这过于简单,但110000000 + (ABS(CHECKSUM(NEWID())) % 10000000) 将是一种非常轻量级的方式来生成您想要的内容。
所以
ALTER TABLE mySchema.myTable ADD CONSTRAINT DF_myColumn
DEFAULT 110000000 + (ABS(CHECKSUM(NEWID())) % 10000000) FOR myColumn
【讨论】:
使用 PHP。
$randnum = "11".rand(1000000, 9999999);
然后将其插入查询中,瞧。
【讨论】:
可能但不是很好的表现。试试这个。
insert into table2(randomNumberColumn)
select convert(bigint,'11' + convert(varchar(100),convert(bigint,right(convert(varchar(100),abs(convert(int,convert(varbinary(16),newid())))),7)))) as a
from table1
其中一个问题是它不能保证 11 位的长度。有时由于数量少,它会是 10。当随机数生成器产生一个小数字时,还没有真正研究如何填写额外的 0。
【讨论】:
Convert(varchar( 没有长度?请不要宣传这种懒惰的语法。 sqlblog.com/blogs/aaron_bertrand/archive/2009/10/09/…
我会尝试:
SELECT '11'+REPLACE(STR(RAND(),9,7),'0.','')
...或者这种细微的变化...
SELECT '11'+RIGHT(STR(RAND(),9,7),7)
...以更快者为准。
【讨论】:
SELECT '11'+RIGHT(STR(0.25,9,7),7),返回 112500000