插入行时生成随机数

时间:2012-06-06 22:09:19

标签: php sql sql-server tsql

我想在一个名为accounts的表中插入数据,其中一个字段必须有一个随机数,从11开始,长度为9位,例如112345673或119876543.这是否可以通过SQL或我必须做在PHP中然后插入那里?

6 个答案:

答案 0 :(得分:3)

如果您一次插入一行......

--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()进行Conrad指出) ,例如

--INSERT dbo.table(column1, random_column)
SELECT name, '11' + RIGHT(1000000 + ABS(CONVERT(BIGINT, 
  CONVERT(VARBINARY(16), NEWID()))), 7) 
FROM sys.all_objects;

(我已注释掉INSERT,因此您可以单独测试结果。)

答案 1 :(得分:3)

这会给你一个11位数的随机数。如果随机数小于9位,则以零为前缀,因此总长度始终为11:

select '11' + right('11000000000' + 
    cast(abs(convert(bigint,convert(varbinary(8),newid()))) as varchar(20)), 9)

答案 2 :(得分:3)

也许这过于简单化,但110000000 + (ABS(CHECKSUM(NEWID())) % 10000000)将是一种非常轻量级的方式来制作你想要的东西。

所以

ALTER TABLE mySchema.myTable ADD CONSTRAINT DF_myColumn
DEFAULT 110000000 + (ABS(CHECKSUM(NEWID())) % 10000000) FOR myColumn

答案 3 :(得分:1)

使用PHP。

$randnum = "11".rand(1000000, 9999999);

然后在查询中插入它,瞧。

答案 4 :(得分:0)

可能但不是很好的表现。试试这个。

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。

答案 5 :(得分:0)

我会尝试:

SELECT '11'+REPLACE(STR(RAND(),9,7),'0.','')

......或者这种轻微的变化......

SELECT '11'+RIGHT(STR(RAND(),9,7),7)

......无论哪个证明更快。