> ## Documentation Index
> Fetch the complete documentation index at: https://clickhouse.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

> 根据给定的 schema 生成随机数据。可用这些数据填充测试表。

# generateRandom

根据给定的 schema 生成随机数据。
可用这些数据填充测试表。
支持所有可存储在表中的数据类型，包括 `JSON`、`Dynamic`、`Variant`、`BFloat16`、`Time` 和 `Time64`。
不支持 `AggregateFunction`、`Interval`、`Nothing` 和 `QBit` 类型。

<h2 id="syntax">
  语法
</h2>

```sql theme={null}
generateRandom(['name TypeName[, name TypeName]...', [, 'random_seed'[, 'max_string_length'[, 'max_array_length']]]][, SETTINGS setting = value[, ...]])
```

<h2 id="arguments">
  参数
</h2>

| 参数 | 说明 |
| - | - |
| `name` | 对应列的名称。 |
| `TypeName` | 对应列的类型。 |
| `random_seed` | 手动指定随机种子，以生成稳定的结果。如果为 `NULL`，则会随机生成种子。 |
| `max_string_length` | 所有生成字符串的最大长度。默认为 `10`。 |
| `max_array_length` | 所有生成数组或 Map 的最大元素个数。默认为 `10`。 |

<h2 id="settings">
  设置
</h2>

`SETTINGS` 是调用时的最后一个参数，用于控制 `Nullable`、`Variant`、`Dynamic` 和 `JSON` 值的生成方式。

| 设置 | 类型 | 默认值 | 描述 |
| - | - | - | - |
| `null_ratio` | `Float` | `0.0625` | `Nullable`、`Variant` 或 `Dynamic` 值为 `NULL` 的概率，也是某行中缺少某个 `JSON` 键的基础概率；少数稀疏键的缺失概率会高出数倍。必须在 `[0, 1]` 范围内。 |
| `max_json_depth` | `UInt64` | `3` | 生成的 `JSON` 对象的最大嵌套深度：`1` 表示无嵌套的对象，数组中的对象也算一层。必须在 `[1, 32]` 范围内。 |
| `max_json_keys_per_object` | `UInt64` | `8` | 生成的 `JSON` 对象每一层最多包含的键数；根对象的键数至少为该值的一半。`0` 表示仅生成类型化路径。不得超过 `1000`。 |

```sql theme={null}
SELECT * FROM generateRandom('x JSON', 3, 4, 2, SETTINGS max_json_depth = 1, max_json_keys_per_object = 3) LIMIT 3 FORMAT JSONEachRow;
```

```text theme={null}
{"x":{"cursor":"","id":[],"parent":-3723905664592977020}}
{"x":{"cursor":"","id":[7037090064212902336]}}
{"x":{"id":[287913403506346525],"parent":-4417942528676528098}}
```

`SETTINGS` 也可以是唯一的参数，此时会沿用目标表的结构：

```sql theme={null}
INSERT INTO test_table SELECT * FROM generateRandom(SETTINGS null_ratio = 0.5) LIMIT 10;
```

<h2 id="returned-value">
  返回值
</h2>

具有所请求 schema 的表对象。

<h2 id="usage-example">
  使用示例
</h2>

```sql theme={null}
SELECT * FROM generateRandom('a Array(Int8), d Decimal32(4), c Tuple(DateTime64(3), UUID)', 1, 10, 2) LIMIT 3;
```

```text theme={null}
┌─a────────┬────────────d─┬─c──────────────────────────────────────────────────────────────────┐
│ [77]     │ -124167.6723 │ ('2061-04-17 21:59:44.573','3f72f405-ec3e-13c8-44ca-66ef335f7835') │
│ [32,110] │ -141397.7312 │ ('1979-02-09 03:43:48.526','982486d1-5a5d-a308-e525-7bd8b80ffa73') │
│ [68]     │  -67417.0770 │ ('2080-03-12 14:17:31.269','110425e5-413f-10a6-05ba-fa6b3e929f15') │
└──────────┴──────────────┴────────────────────────────────────────────────────────────────────┘
```

```sql theme={null}
CREATE TABLE random (a Array(Int8), d Decimal32(4), c Tuple(DateTime64(3), UUID)) ENGINE=Memory;
INSERT INTO random SELECT * FROM generateRandom() LIMIT 2;
SELECT * FROM random;
```

```text theme={null}
┌─a────────────────────────────┬────────────d─┬─c──────────────────────────────────────────────────────────────────┐
│ []                           │   68091.8197 │ ('2037-10-02 12:44:23.368','039ecab7-81c2-45ee-208c-844e5c6c5652') │
│ [8,-83,0,-22,65,9,-30,28,64] │ -186233.4909 │ ('2062-01-11 00:06:04.124','69563ea1-5ad1-f870-16d8-67061da0df25') │
└──────────────────────────────┴──────────────┴────────────────────────────────────────────────────────────────────┘
```

配合 [generateRandomStructure](/docs/zh/reference/functions/regular-functions/other-functions#generateRandomStructure)：

```sql theme={null}
SELECT * FROM generateRandom(generateRandomStructure(4, 101), 101) LIMIT 3;
```

```text theme={null}
┌──────────────────c1─┬──────────────────c2─┬─c3─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┬─c4──────────────────────────────────────┐
│ 1996-04-15 06:40:05 │ 33954608387.2844801 │ ['232.78.216.176','9.244.59.211','211.21.80.152','44.49.94.109','165.77.195.182','68.167.134.239','212.13.24.185','1.197.255.35','192.55.131.232'] │ 45d9:2b52:ab6:1c59:185b:515:c5b6:b781   │
│ 2063-01-13 01:22:27 │ 36155064970.9514454 │ ['176.140.188.101']                                                                                                                                │ c65a:2626:41df:8dee:ec99:f68d:c6dd:6b30 │
│ 2090-02-28 14:50:56 │  3864327452.3901373 │ ['155.114.30.32']                                                                                                                                  │ 57e9:5229:93ab:fbf3:aae7:e0e4:d1eb:86b  │
└─────────────────────┴─────────────────────┴────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┴─────────────────────────────────────────┘
```

未指定 `structure` 参数时 (在这种情况下，结构是随机的) ：

```sql theme={null}
SELECT * FROM generateRandom() LIMIT 3;
```

```text theme={null}
┌───c1─┬─────────c2─┬─────────────────────c3─┬──────────────────────c4─┬─c5───────┐
│ -128 │  317300854 │ 2030-08-16 08:22:20.65 │ 1994-08-16 12:08:56.745 │ R0qgiC46 │
│   40 │ -744906827 │ 2059-04-16 06:31:36.98 │ 1975-07-16 16:28:43.893 │ PuH4M*MZ │
│  -55 │  698652232 │ 2052-08-04 20:13:39.68 │ 1998-09-20 03:48:29.279 │          │
└──────┴────────────┴────────────────────────┴─────────────────────────┴──────────┘
```

同时为随机结构和随机数据指定随机种子：

```sql theme={null}
SELECT * FROM generateRandom(11) LIMIT 3;
```

```text theme={null}
┌───────────────────────────────────────c1─┬─────────────────────────────────────────────────────────────────────────────c2─┬─────────────────────────────────────────────────────────────────────────────c3─┬─────────c4─┬─────────────────────────────────────────────────────────────────────────────c5─┬──────────────────────c6─┬─c7──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┬─c8──────────────────────────────────────┬─────────c9─┐
│  -77422512305044606600216318673365695785 │   636812099959807642229.503817849012019401335326013846687285151335352272727523 │ -34944452809785978175157829109276115789694605299387223845886143311647505037529 │  544473976 │ 111220388331710079615337037674887514156741572807049614590010583571763691328563 │       22016.22623506465 │ {'2052-01-31 20:25:33':4306400876908509081044405485378623663,'1993-04-16 15:58:49':164367354809499452887861212674772770279,'2101-08-19 03:07:18':-60676948945963385477105077735447194811,'2039-12-22 22:31:39':-59227773536703059515222628111999932330} │ a7b2:8f58:4d07:6707:4189:80cf:92f5:902d │ 1950-07-14 │
│ -159940486888657488786004075627859832441 │  629206527868163085099.8195700356331771569105231840157308480121506729741348442 │ -53203761250367440823323469081755775164053964440214841464405368882783634063735 │ 2187136525 │  94881662451116595672491944222189810087991610568040618106057495823910493624275 │ 1.3095786748458954e-104 │ {}                                                                                                                                                                                                                                                      │ a051:e3da:2e0a:c69:7835:aed6:e8b:3817   │ 1943-03-25 │
│   -5239084224358020595591895205940528518 │ -529937657954363597180.1709207212648004850138812370209091520162977548101577846 │  47490343304582536176125359129223180987770215457970451211489086575421345731671 │ 1637451978 │ 101899445785010192893461828129714741298630410942962837910400961787305271699002 │  2.4344456058391296e223 │ {'2013-12-22 17:42:43':80271108282641375975566414544777036006,'2041-03-08 10:28:17':169706054082247533128707458270535852845,'1986-08-31 23:07:38':-54371542820364299444195390357730624136,'2094-04-23 21:26:50':7944954483303909347454597499139023465}  │ 1293:a726:e899:9bfc:8c6f:2aa1:22c9:b635 │ 1924-11-20 │
└──────────────────────────────────────────┴────────────────────────────────────────────────────────────────────────────────┴────────────────────────────────────────────────────────────────────────────────┴────────────┴────────────────────────────────────────────────────────────────────────────────┴─────────────────────────┴─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┴─────────────────────────────────────────┴────────────┘
```

<Note>
  如果 `max_array_length` 设置得足够大，`generateRandom(generateRandomStructure(), [random seed], max_string_length, max_array_length)` 可能会生成极其庞大的输出，因为复杂类型 (`Array`、`Tuple`、`Map`、`Nested`) 的嵌套深度可能很大 (最高可达 16) 。
</Note>

<h2 id="generating-json">
  生成 JSON
</h2>

生成的 `JSON` 列读起来就像一串遵循同一 schema 的文档：键的集合以及每个键的类型均由随机种子决定，并在整列中保持不变；而值、缺失的键以及数组长度则逐行变化。对象的深度受 `max_json_depth` 限制，单层中的键数量受 `max_json_keys_per_object` 限制，某个键在一行中缺失的概率为 `null_ratio`。叶子节点的类型与 JSON 解析器对真实文档推断出的类型一致：`Int64`、`UInt64`、`Float64`、`Bool`、`String`、`Date`、`DateTime`、上述类型的数组、对象数组以及混合数组；与从应用程序中采集的数据类似，少数键会在一小部分行中呈现不同的类型。

类型声明决定了所生成 schema 的形态：类型化路径始终存在，且采用其声明的类型；被 `SKIP` 和 `SKIP REGEXP` 排除的路径永远不会生成；同时 `max_dynamic_paths` 和 `max_dynamic_types` 的限制均会得到遵守，因此超出 `max_dynamic_paths` 的路径最终会存入该列的共享数据中。

```sql theme={null}
SELECT * FROM generateRandom('x JSON', 1) LIMIT 3 FORMAT JSONEachRow;
```

```text theme={null}
{"x":{"product_id":"2050-12-17 01:46:35","stage":"g|(&Ql","started":{"group":-80611897324989285}}}
{"x":{"product_id":"2013-10-17 22:35:26","stage":"^ipx|,=a5N","started":{"group":-1326235429680389454}}}
{"x":{"product_id":"1974-11-17 22:22:46","stage":"(U]p'l`","started":{"group":-344141642787805595}}}
```

也可以使用目标插入表的结构，这样向包含 `JSON`、`Dynamic` 或 `Variant` 列的表中
填充数据会更方便：

```sql theme={null}
CREATE TABLE t (x JSON) ENGINE = MergeTree ORDER BY tuple();
INSERT INTO t SELECT * FROM generateRandom() LIMIT 10;
```

<h2 id="related-content">
  相关内容
</h2>

* 博客：[在 ClickHouse 中生成随机测试数据](https://clickhouse.com/blog/generating-random-test-distribution-data-for-clickhouse)
