我想在一个名为accounts的表中插入数据,其中一个字段必须有一个随机数,从11开始,长度为9位,例如112345673或119876543.这是否可以通过SQL或我必须做在PHP中然后插入那里?
答案 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)
......无论哪个证明更快。