ClickHouse/docs/zh/query_language/insert_into.md

69 lines
2.6 KiB
Markdown
Raw Normal View History

<a name="queries-insert"></a>
## INSERT
正在添加数据。
基本查询格式:
```sql
INSERT INTO [db.]table [(c1, c2, c3)] VALUES (v11, v12, v13), (v21, v22, v23), ...
```
此查询能够指定字段的列表来插入 `[(c1, c2, c3)]`。 在这种情况下, 剩下的字段用如下来填充:
- 从表定义中指定的 `DEFAULT` 表达式中计算出值。
- 空字符串, 如果 `DEFAULT` 表达式没有定义。
如果 [strict_insert_defaults=1](../operations/settings/settings.md#settings-strict_insert_defaults) 没有 `DEFAULT` 定义的字段必须在查询中列出.
在任何ClickHouse所支持的格式上 [format](../interfaces/formats.md#formats) 数据被传入到 INSERT中. 此格式必须被显式地指定在查询中:
```sql
INSERT INTO [db.]table [(c1 c2 c3)] FORMAT format_name data_set
```
例如, 如下的查询格式与基本的 `INSERT ... VALUES` 版本相同:
```sql
INSERT INTO [db.]table [(c1, c2, c3)] FORMAT Values (v11, v12, v13), (v21, v22, v23), ...
```
ClickHouse 在数据之前, 删除所有空格和换行(如果有)。 当形成一个查询时, 我们推荐在查询操作符之后将数据放入新行(如果数据以空格开始, 这是重要的)。
示例:
```sql
INSERT INTO t FORMAT TabSeparated
11 Hello, world!
22 Qwerty
```
你能够单独从查询中插入数据,通过命令行或 HTTP 接口. 进一步信息, 参见 "[Interfaces](../interfaces/index.md#interfaces)".
### Inserting The Results of `SELECT`
```sql
INSERT INTO [db.]table [(c1, c2, c3)] SELECT ...
```
在 SELECT语句中 根据字段的位置来映射。 然而, 在SELECT表达式中的名称和表名可能不同。 如果必要, 可以进行类型转换。
除了值以外没有其他数据类型允许设置值到表达式中, 例如 `now()` `1 + 2` 等。 值格式允许使用有限制的表达式, 但是它并不推荐, 因为在这种情况下, 执行了低效的代码。
不支持修改数据分区的查询如下: `UPDATE` `DELETE` `REPLACE` `MERGE` `UPSERT` `INSERT UPDATE`
然而, 你能够使用 `ALTER TABLE ... DROP PARTITION`来删除旧数据。
### Performance Considerations
`INSERT` 通过主键来排序数据, 并通过月份来拆分数据到每个分区中。 如果插入的数据有混合的月份, 会显著降低`INSERT` 插入的性能。 应该避免此类操作:
- 大批量地添加数据, 如每次 100000 行。
- 在上传数据之前, 通过月份分组数据。
下面操作性能不会下降:
- 数据实时插入。
- 上传的数据通过时间来排序。