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')