Intro
-
背景
需求:数据表中有几列数据为空(不全),我需要填充他们,以便测试。
解决方法大致有几种:- 依赖层最多的一项:写代码执行数据库插入操作。在编程语言拼SQL参数的时候,插入生成的随机数。
- 写代码,利用
for循环 + 随机数/随机字符串
,生成SQL的写操作语句。然后在数据库客户端执行这些语句。 - 依赖最少的一项:直接在SQL中生成随机数。直接执行SQL语句即可。保存SQL片段也方便,以便下次执行。
不想很麻烦的去编写接口。所以我选了第三种。
-
以下是我最终的SQL格式:
update table_name
set
field1 = 随机数,
field2 = 随机字符串,
field3 = 随机日期
注意以上语句没有where
子句。也就是说会对表中的所有记录的对应字段进行值的修改,效果相当于for循环。
SQL
- 测试语句
select xxx from dual
,其中xxx可为任意值
随机数
dbms_random.value
返回一个随机数,区间在[0, 1)
,注意区间为左开右闭
即区间不包含1。
dbms_random.value(a, b)
返回一个随机数,区间在[a, b)
,同样:b不在区间内。
NOTE 以上两种方法,返回值都带着一串小数。
想要截取整数,要用到trunc(number, precision)
,如:trunc(123.456)
返回123。(precision默认为0)
随机字符串
random.string('L', length)
返回长度为length、由随机的小写字符填充的字符串。
第一个参数的可选值:
L
Lower 小写的。
U
Upper 大写的。
A
Admix 大小写混合的。
随机日期
每个日期对应一个数值。
首先,查看今天的数值:to_char(sysdate, 'J')
今天是2020-02-16
,返回值为2458901
。
那我想生成的日期范围:[今天, 今天+30天]
,即从天开始的30天(第30天不包含)。
to_date(2458901, 'J')
就是今天(date类型)
to_date(2458901 + 30, 'J')
就是30天后。
由随机函数生成这个要增加的数值,可以达到目的。
to_date(2458901 + trunc(dbms_random.value(1, 30)), 'J')
Others
trunc(sysdate, 'J')