Php 插入行时生成随机数
我想在名为accounts的表中插入数据,其中一个字段必须有一个随机数,从11开始,长度为9位,例如112345673或119876543。这是通过SQL实现的,还是我必须在PHP中完成,然后插入到那里?可能,但性能不太好。试试这个Php 插入行时生成随机数,php,sql,sql-server,tsql,Php,Sql,Sql Server,Tsql,我想在名为accounts的表中插入数据,其中一个字段必须有一个随机数,从11开始,长度为9位,例如112345673或119876543。这是通过SQL实现的,还是我必须在PHP中完成,然后插入到那里?可能,但性能不太好。试试这个 insert into table2(randomNumberColumn) select convert(bigint,'11' + convert(varchar(100),convert(bigint,right(convert(varchar(100),ab
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。使用PHP
$randnum=11.rand1000000,9999999
然后在查询中插入它,瞧。如果一次插入一行
--INSERT dbo.table(column1, random_column)
SELECT 'column1_value',
'11' + RIGHT(REPLACE(CONVERT(VARCHAR(12), RAND()), '.', ''), 3)
+ RIGHT(REPLACE(CONVERT(VARCHAR(12), RAND()), '.', ''), 4);
如果这是多行选择的一部分,您将看到分配给每一行的相同编号,因此您需要根据每一行中的其他数据或使用Conrad指出的NEWID进行随机化,例如
--INSERT dbo.table(column1, random_column)
SELECT name, '11' + RIGHT(1000000 + ABS(CONVERT(BIGINT,
CONVERT(VARBINARY(16), NEWID()))), 7)
FROM sys.all_objects;
我已经注释掉了插入内容,因此您可以独立测试结果。这将为您提供一个11位随机数。如果随机数小于9位,则其前缀为零,因此总长度始终为11:
select '11' + right('11000000000' +
cast(abs(convert(bigint,convert(varbinary(8),newid()))) as varchar(20)), 9)
也许这过于简单,但是110000000+ABSCHECKSUMNEWID%10000000将是一种非常轻量级的方法来生成您想要的内容 所以 我会尝试:
SELECT '11'+REPLACE(STR(RAND(),9,7),'0.','')
…或者这个微小的变化
SELECT '11'+RIGHT(STR(RAND(),9,7),7)
…以证明更快的为准。如果要将其插入表中,我将如何实现它?Convertvarchar不带长度?请不要推广这种懒惰的语法@aaron修改为不那么懒惰,但仍然懒惰。还要注意,这个解决方案并不总是给出9位数。你也可以随机化,但我相信你知道that@ConradFrix是的,NEWID已经有了另一个答案,所以我想我会提供一个稍微不同的方法。我没想到会返回11位数字,但只要a点是数字分隔符+1@Andomar是的,对不起,应该提到的是,它确实依赖于区域设置才能正常阅读:与我的相同:-对于MySQL用户:显然MySQL缺少newid,但有一个类似的uuid函数。这实际上导致了11位数字,即9-您需要一个唯一的随机数,还是任何随机数都可以?RAND有时在小数点后没有足够的数字,因此您不能依靠此解决方案始终提供9位。@AaronBertrand这不是问题,因为如果RAND短,STR将提供尾随零,与以下示例相同:选择“11”+RIGHTSTR0.25,9,7,7,返回112500000
SELECT '11'+RIGHT(STR(RAND(),9,7),7)