05-insert.md 7.1 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
---
title: Insert
---

## Syntax

```sql
INSERT INTO
    tb_name
        [USING stb_name [(tag1_name, ...)] TAGS (tag1_value, ...)]
        [(field1_name, ...)]
        VALUES (field1_value, ...) [(field1_value2, ...) ...] | FILE csv_file_path
    [tb2_name
        [USING stb_name [(tag1_name, ...)] TAGS (tag1_value, ...)]
        [(field1_name, ...)]
        VALUES (field1_value, ...) [(field1_value2, ...) ...] | FILE csv_file_path
    ...];
```

## Insert Single or Multiple Rows

S
Sean Ely 已提交
22
Single row or multiple rows specified with VALUES can be inserted into a specific table. For example:
23

S
Sean Ely 已提交
24
A single row is inserted using the below statement.
25 26 27 28 29

```sq;
INSERT INTO d1001 VALUES (NOW, 10.2, 219, 0.32);
```

S
Sean Ely 已提交
30
Double rows are inserted using the below statement.
31 32 33 34 35 36 37 38

```sql
INSERT INTO d1001 VALUES ('2021-07-13 14:06:32.272', 10.2, 219, 0.32) (1626164208000, 10.15, 217, 0.33);
```

:::note

1. In the second example above, different formats are used in the two rows to be inserted. In the first row, the timestamp format is a date and time string, which is interpreted from the string value only. In the second row, the timestamp format is a long integer, which will be interpreted based on the database time precision.
S
Sean Ely 已提交
39
2. When trying to insert multiple rows in a single statement, only the timestamp of one row can be set as NOW, otherwise there will be duplicate timestamps among the rows and the result may be out of expectation because NOW will be interpreted as the time when the statement is executed.
40 41 42 43 44 45 46 47 48 49 50 51 52 53
3. The oldest timestamp that is allowed is subtracting the KEEP parameter from current time.
4. The newest timestamp that is allowed is adding the DAYS parameter to current time.

:::

## Insert Into Specific Columns

Data can be inserted into specific columns, either single row or multiple row, while other columns will be inserted as NULL value.

```
INSERT INTO d1001 (ts, current, phase) VALUES ('2021-07-13 14:06:33.196', 10.27, 0.31);
```

:::info
S
Sean Ely 已提交
54
If no columns are explicitly specified, all the columns must be provided with values, this is called "all column mode". The insert performance of all column mode is much better than specifying a subset of columns, so it's encouraged to use "all column mode" while providing NULL value explicitly for the columns for which no actual value can be provided.
55 56 57 58 59

:::

## Insert Into Multiple Tables

S
Sean Ely 已提交
60
One or multiple rows can be inserted into multiple tables in a single SQL statement, with or without specifying specific columns.
61 62 63 64 65 66 67 68

```sql
INSERT INTO d1001 VALUES ('2021-07-13 14:06:34.630', 10.2, 219, 0.32) ('2021-07-13 14:06:35.779', 10.15, 217, 0.33)
            d1002 (ts, current, phase) VALUES ('2021-07-13 14:06:34.255', 10.27, 0.31;
```

## Automatically Create Table When Inserting

S
Sean Ely 已提交
69
If it's unknown whether the table already exists, the table can be created automatically while inserting using the SQL statement below. To use this functionality, a STable must be used as template and tag values must be provided.
70 71

```sql
G
gccgdb1234 已提交
72
INSERT INTO d21001 USING meters TAGS ('California.SanFrancisco', 2) VALUES ('2021-07-13 14:06:32.272', 10.2, 219, 0.32);
73 74
```

S
Sean Ely 已提交
75
It's not necessary to provide values for all tags when creating tables automatically, the tags without values provided will be set to NULL.
76 77 78 79 80

```sql
INSERT INTO d21001 USING meters (groupId) TAGS (2) VALUES ('2021-07-13 14:06:33.196', 10.15, 217, 0.33);
```

S
Sean Ely 已提交
81
Multiple rows can also be inserted into the same table in a single SQL statement.
82 83

```sql
G
gccgdb1234 已提交
84
INSERT INTO d21001 USING meters TAGS ('California.SanFrancisco', 2) VALUES ('2021-07-13 14:06:34.630', 10.2, 219, 0.32) ('2021-07-13 14:06:35.779', 10.15, 217, 0.33)
85 86 87 88 89
            d21002 USING meters (groupId) TAGS (2) VALUES ('2021-07-13 14:06:34.255', 10.15, 217, 0.33)
            d21003 USING meters (groupId) TAGS (2) (ts, current, phase) VALUES ('2021-07-13 14:06:34.255', 10.27, 0.31);
```

:::info
S
Sean Ely 已提交
90
Prior to version 2.0.20.5, when using `INSERT` to create tables automatically and specifying the columns, the column names must follow the table name immediately. From version 2.0.20.5, the column names can follow the table name immediately, also can be put between `TAGS` and `VALUES`. In the same SQL statement, however, these two ways of specifying column names can't be mixed.
91 92 93 94
:::

## Insert Rows From A File

S
Sean Ely 已提交
95
Besides using `VALUES` to insert one or multiple rows, the data to be inserted can also be prepared in a CSV file with comma as separator and each field value quoted by single quotes. Table definition is not required in the CSV file. For example, if file "/tmp/csvfile.csv" contains the below data:
96 97 98 99 100 101

```
'2021-07-13 14:07:34.630', '10.2', '219', '0.32'
'2021-07-13 14:07:35.779', '10.15', '217', '0.33'
```

S
Sean Ely 已提交
102
Then data in this file can be inserted by the SQL statement below:
103 104 105 106 107 108 109

```sql
INSERT INTO d1001 FILE '/tmp/csvfile.csv';
```

## Create Tables Automatically and Insert Rows From File

S
Sean Ely 已提交
110
From version 2.1.5.0, tables can be automatically created using a super table as template when inserting data from a CSV file, like below:
111 112

```sql
G
gccgdb1234 已提交
113
INSERT INTO d21001 USING meters TAGS ('California.SanFrancisco', 2) FILE '/tmp/csvfile.csv';
114 115
```

S
Sean Ely 已提交
116
Multiple tables can be automatically created and inserted in a single SQL statement, like below:
117 118

```sql
G
gccgdb1234 已提交
119
INSERT INTO d21001 USING meters TAGS ('California.SanFrancisco', 2) FILE '/tmp/csvfile_21001.csv'
120 121 122 123 124
            d21002 USING meters (groupId) TAGS (2) FILE '/tmp/csvfile_21002.csv';
```

## More About Insert

S
Sean Ely 已提交
125
For SQL statement like `insert`, a stream parsing strategy is applied. That means before an error is found and the execution is aborted, the part prior to the error point has already been executed. Below is an experiment to help understand the behavior.
126

S
Sean Ely 已提交
127
First, a super table is created.
128 129 130 131 132

```sql
CREATE TABLE meters(ts TIMESTAMP, current FLOAT, voltage INT, phase FLOAT) TAGS(location BINARY(30), groupId INT);
```

S
Sean Ely 已提交
133
It can be proven that the super table has been created by `SHOW STableS`, but no table exists using `SHOW TABLES`.
134 135 136 137 138 139 140 141 142 143 144 145 146 147 148

```
taos> SHOW STableS;
              name              |      created_time       | columns |  tags  |   tables    |
============================================================================================
 meters                         | 2020-08-06 17:50:27.831 |       4 |      2 |           0 |
Query OK, 1 row(s) in set (0.001029s)

taos> SHOW TABLES;
Query OK, 0 row(s) in set (0.000946s)
```

Then, try to create table d1001 automatically when inserting data into it.

```sql
G
gccgdb1234 已提交
149
INSERT INTO d1001 USING meters TAGS('California.SanFrancisco', 2) VALUES('a');
150 151 152 153 154 155 156 157 158 159 160 161 162 163
```

The output shows the value to be inserted is invalid. But `SHOW TABLES` proves that the table has been created automatically by the `INSERT` statement.

```
DB error: invalid SQL: 'a' (invalid timestamp) (0.039494s)

taos> SHOW TABLES;
           table_name           |      created_time       | columns |          STable_name           |
======================================================================================================
 d1001                          | 2020-08-06 17:52:02.097 |       4 | meters                         |
Query OK, 1 row(s) in set (0.001091s)
```

S
Sean Ely 已提交
164
From the above experiment, we can see that while the value to be inserted is invalid the table is still created.