# SQL 写入

import Tabs from "@theme/Tabs";
import TabItem from "@theme/TabItem";

## SQL 写入

应用通过 C/C++, Java, Go, C#, Python, Node.js 连接器执行 SQL insert 语句来插入数据，用户还可以通过 TAOS Shell，手动输入 SQL insert 语句插入数据。比如下面这条 insert 就将一条记录写入到表 d1001 中：

```mysql
INSERT INTO d1001 VALUES (1538548685000, 10.3, 219, 0.31);
```

TDengine 支持一次写入多条记录，比如下面这条命令就将两条记录写入到表 d1001 中：

```mysql
INSERT INTO d1001 VALUES (1538548684000, 10.2, 220, 0.23) (1538548696650, 10.3, 218, 0.25);
```

TDengine 也支持一次向多个表写入数据，比如下面这条命令就向 d1001 写入两条记录，向 d1002 写入一条记录：

```mysql
INSERT INTO d1001 VALUES (1538548685000, 10.3, 219, 0.31) (1538548695000, 12.6, 218, 0.33) d1002 VALUES (1538548696800, 12.3, 221, 0.31);
```

详细的 SQL INSERT 语法规则请见 [TAOS SQL 的数据写入](https://www.taosdata.com/cn/documentation/taos-sql#insert) 章节。

:::tip

- 要提高写入效率，需要批量写入。一批写入的记录条数越多，插入效率就越高。但一条记录不能超过 16K，一条 SQL 语句总长度不能超过 1M 。
- TDengine 支持多线程同时写入，要进一步提高写入速度，一个客户端需要打开 20 个以上的线程同时写。但线程数达到一定数量后，无法再提高，甚至还会下降，因为线程频繁切换，带来额外开销。
- 对同一张表，如果新插入记录的时间戳已经存在，默认情形下（UPDATE=0）新记录将被直接抛弃，也就是说，在一张表里，时间戳必须是唯一的。如果应用自动生成记录，很有可能生成的时间戳是一样的，这样，成功插入的记录条数会小于应用插入的记录条数。如果在创建数据库时使用了 UPDATE 1 选项，插入相同时间戳的新记录将覆盖原有记录。
- 写入的数据的时间戳必须大于当前时间减去配置参数 keep 的时间。如果 keep 配置为 3650 天，那么无法写入比 3650 天还早的数据。写入数据的时间戳也不能大于当前时间加配置参数 days。如果 days 为 2，那么无法写入比当前时间还晚 2 天的数据。

:::

## 示例程序

### 普通 SQL 写入

<Tabs defaultValue="java">
  <TabItem label="Java" value="java"></TabItem>
  <TabItem label="Python" value="Python"></TabItem>
  <TabItem label="Go" value="go"></TabItem>
  <TabItem label="C" value="c"></TabItem>
  <TabItem label="Rust" value="rust"></TabItem>
  <TabItem label="Node.js" value="nodejs"></TabItem>
  <TabItem label="C#" value="csharp"></TabItem>
</Tabs>

### 动态绑定写入

（补充介绍）

### 示例代码

<Tabs defaultValue="java">
  <TabItem label="Java" value="java"></TabItem>
  <TabItem label="Python" value="Python"></TabItem>
  <TabItem label="Go" value="go"></TabItem>
  <TabItem label="C" value="c"></TabItem>
  <TabItem label="Rust" value="rust"></TabItem>
  <TabItem label="Node.js" value="nodejs"></TabItem>
  <TabItem label="C#" value="csharp"></TabItem>
</Tabs>
