【问题标题】:Generate random number while inserting row插入行时生成随机数
【发布时间】:2012-06-06 22:09:19
【问题描述】:

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

【问题讨论】:

  • 您需要一个唯一的随机数,还是任何随机数都可以?

标签: php sql sql-server tsql


【解决方案1】:

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

--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 注释掉,因此您可以独立测试结果。)

【讨论】:

  • 你也可以随机化based on newID,但我相信你知道
  • @ConradFrix 是的,NEWID() 已经有了另一个答案,所以我想我会提供一种稍微不同的方法。
  • 我没想到它会返回 11 位数字,但只要 a 点是数字分隔符,+1 就会返回 1
  • @Andomar 是的,抱歉,应该提到它确实依赖于区域设置才能“正常”(阅读:与我的相同)。 :-)
  • 对于 MySQL 用户:显然 MySQL 缺少 newid(),但有类似的 uuid() 功能
【解决方案2】:

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

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

【讨论】:

  • 这实际上导致了 11 位数字(OP 想要 9)。 :-)
【解决方案3】:

也许这过于简单,但110000000 + (ABS(CHECKSUM(NEWID())) % 10000000) 将是一种非常轻量级的方式来生成您想要的内容。

所以

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

【讨论】:

    【解决方案4】:

    使用 PHP。

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

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

    【讨论】:

      【解决方案5】:

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

      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/…
      • @aaron 修改为不那么懒惰但仍然懒惰。
      • 另请注意,此解决方案并不总是给出 9 位数字。
      【解决方案6】:

      我会尝试:

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

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

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

      ...以更快者为准。

      【讨论】:

      • RAND() 有时小数点后没有足够的数字,因此您不能依靠此解决方案始终提供 9 位数字。
      • @AaronBertrand 这不是问题,因为如果 RAND 很短,STR 将提供尾随零,如下例所示:SELECT '11'+RIGHT(STR(0.25,9,7),7),返回 112500000
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-03
      相关资源
      最近更新 更多