0

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

4

6 回答 6

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()康拉德指出的),例如

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

(我已经注释掉了,INSERT所以你可以独立测试结果。)

于 2012-06-06T22:13:34.607 回答
3

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

所以

ALTER TABLE mySchema.myTable ADD CONSTRAINT DF_myColumn
DEFAULT 110000000 + (ABS(CHECKSUM(NEWID())) % 10000000) FOR myColumn
于 2012-06-06T22:39:56.250 回答
3

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

select '11' + right('11000000000' + 
    cast(abs(convert(bigint,convert(varbinary(8),newid()))) as varchar(20)), 9)
于 2012-06-06T22:19:31.727 回答
1

使用 PHP。

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

然后只需将其插入查询中,瞧。

于 2012-06-06T22:12:38.227 回答
0

我会尝试:

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

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

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

...以更快的速度证明。

于 2012-06-07T01:23:20.167 回答
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。

于 2012-06-06T22:12:01.643 回答