描述

该语句用于添加一个或多个记录到表中。

格式

  1. INSERT [hint_options] { single_table_insert | multi_table_insert }
  2. single_table_insert:
  3. { INTO insert_table_clause opt_nologging '(' column_list ')' values_clause [{ RETURNING | RETURN } returning_exprs [into_clause]]
  4. | INTO insert_table_clause opt_nologging '(' ')' values_clause [{ RETURNING | RETURN } returning_exprs [into_clause]]
  5. | INTO insert_table_clause opt_nologging values_clause [{ RETURNING | RETURN } returning_exprs [into_clause]]
  6. }
  7. opt_nologging: { NOLOGGING | /*EMPTY*/ }
  8. returning_exprs:
  9. projection [, ...]
  10. insert_into_clause:
  11. { INTO into_var_list | BULK COLLECT INTO into_var_list}
  12. into_var_list:
  13. { USER_VARIABLE | ref_name } [, ...]
  14. values_clause:
  15. VALUES ({ expr | DEFAULT } [, { expr | DEFAULT } ]... )
  16. multi_table_insert:
  17. { ALL { insert_into_clause [ values_clause ] [error_logging_clause] }
  18. | conditional_insert_clause
  19. } subquery
  20. conditional_insert_clause:
  21. [ ALL | FIRST ]
  22. WHEN condition
  23. THEN insert_into_clause
  24. [ values_clause ]
  25. [ error_logging_clause ]
  26. [ insert_into_clause [ values_clause ] [ error_logging_clause ] ]...
  27. [ WHEN condition
  28. THEN insert_into_clause
  29. [ values_clause ]
  30. [ error_logging_clause ]
  31. [ insert_into_clause [ values_clause ] [ error_logging_clause ] ]...
  32. ]...
  33. [ ELSE insert_into_clause
  34. [ values_clause ]
  35. [ error_logging_clause ]
  36. [ insert_into_clause [ values_clause ] [ error_logging_clause ] ]...
  37. ]
  38. error_logging_clause:
  39. LOG ERRORS [ INTO [schema.] table ] [ (simple_expression) ] [ REJECT LIMIT { integer | UNLIMITED } ]

参数解释

参数

描述

hint_options

指定 Hint 选项。

single_table_insert

单表插入。

insert_table_clause

指定的插入的表,可以是基表、可更新视图、特殊子查询。

opt_nologging

尽量减少插入时的日志信息。

column_list

指定要插入的列名。

returning_exprs

返回插入数据之后的投影列。

insert_into_clause

将插入数据之后的列值插入到指定列表中。

multi_table_insert

多表插入。

conditional_insert_clause

带条件的多表插入。

  • ALL:遍历所有匹配条件的分支,只要满足条件就会将数据插入对应的表。

  • FIRST:找到第一个满足条件的分支后,将数据插入该分支对应的表,不会再继续检查剩余分支的条件是否满足。

注意

特殊子查询指的类似于可更新视图对应的子查询,这类子查询不应该包含复杂的算子(比如 group by/distinct/window function 等)

示例

示例表及数据基于以下定义:

  1. obclient>CREATE TABLE t1(c1 INT PRIMARY KEY, c2 INT,c3 INT);
  2. Query OK, 0 rows affected (0.10 sec)
  3. obclient> SELECT * FROM t;
  4. Empty set (0.02 sec)
  • 单表插入:向表 t 中插入一行数据。
  1. obclient> INSERT INTO t VALUES(1,2,3);
  2. Query OK, 1 row affected (0.00 sec)
  3. obclient> SELECT * FROM t;
  4. +----+------+------+
  5. | C1 | C2 | C3 |
  6. +----+------+------+
  7. | 1 | 2 | 3 |
  8. +----+------+------+
  9. 1 row in set (0.00 sec)
  • 单表插入:直接向子查询中插入数据
  1. obclient>INSERT INTO (SELECT * FROM t) VALUES(1,2,3);
  2. Query OK, 1 row affected (0.00 sec)
  3. obclient> SELECT * FROM t;
  4. +----+------+------+
  5. | C1 | C2 | C3 |
  6. +----+------+------+
  7. | 1 | 2 | 3 |
  8. +----+------+------+
  9. 1 row in set (0.01 sec)
  • 单表插入:包含 RETURNING 子句。
  1. obclient>INSERT INTO t VALUES(1,2,3) RETURNING c1;
  2. +----+
  3. | C1 |
  4. +----+
  5. | 1 |
  6. +----+
  7. 1 row in set (0.00 sec)
  8. obclient>SELECT * FROM t;
  9. +----+------+------+
  10. | C1 | C2 | C3 |
  11. +----+------+------+
  12. | 1 | 2 | 3 |
  13. +----+------+------+
  14. 1 row in set (0.00 sec)
  • 普通的多表插入:当表 t 中有至少一行数据时,向表 t1 插入一行数据 (1,1,1),向表 t2 插入一行数据 (2,2,2)。
  1. obclient>INSERT ALL INTO t1 VALUES(1,1,1) INTO t2 VALUES(2,2,2) SELECT * FROM t
  2. WHERE ROWNUM< 2;
  3. Query OK, 2 rows affected (0.01 sec)
  4. Records: 2 Duplicates: 0 Warnings: 0
  5. obclient>SELECT * FROM t1;
  6. +----+------+------+
  7. | C1 | C2 | C3 |
  8. +----+------+------+
  9. | 1 | 1 | 1 |
  10. +----+------+------+
  11. 1 row in set (0.02 sec)
  12. obclient>SELECT * FROM t2;
  13. +----+------+------+
  14. | C1 | C2 | C3 |
  15. +----+------+------+
  16. | 2 | 2 | 2 |
  17. +----+------+------+
  18. 1 row in set (0.01 sec)
  • 带条件的多表插入:使用 INSERT ALL,当表 t 中 c2 的值大于 1 时,向表 t1 中插入数据 (1,1,1);当表 t 中 c3 的值大于 1 时,向表 t2 中插入数据 (2,2,2);如果都不满足,则向表 t1 中插入数据 (3,3,3)。
  1. obclient>DELETE FROM (SELECT * FROM t);
  2. Query OK, 4 rows affected (0.04 sec)
  3. obclient>INSERT INTO t VALUES(1,2,3);
  4. Query OK, 1 row affected (0.00 sec)
  5. obclient>INSERT ALL
  6. WHEN c2 > 1 THEN INTO t1 VALUES(1,1,1)
  7. WHEN c3 > 1 THEN INTO t2 VALUES(2,2,2)
  8. ELSE INTO t1 VALUES(3,3,3) SELECT c2,c3 FROM t;
  9. Query OK, 2 rows affected (0.01 sec)
  10. Records: 2 Duplicates: 0 Warnings: 0
  11. obclient>SELECT * FROM t1;
  12. +----+------+------+
  13. | C1 | C2 | C3 |
  14. +----+------+------+
  15. | 1 | 1 | 1 |
  16. +----+------+------+
  17. 1 row in set (0.00 sec)
  18. obclient>SELECT * FROM t2;
  19. +----+------+------+
  20. | C1 | C2 | C3 |
  21. +----+------+------+
  22. | 2 | 2 | 2 |
  23. +----+------+------+
  24. 1 row in set (0.00 sec)
  • 带条件的多表插入:使用 INSERT FIRST,当表 t 中 c2 的值大于 1 时,向表 t1 中插入数据 (1,1,1),向表 t2 中插入数据 (4,4,4);当表 t 中 c3 的值大于 1 时,向表 t2 中插入数据 (2,2,2);如果都不满足,则向表 t1 中插入数据 (3,3,3)。
  1. obclient>DELETE FROM (SELECT * FROM t);
  2. Query OK, 4 rows affected (0.04 sec)
  3. obclient>INSERT INTO t VALUES(1,2,3);
  4. Query OK, 1 row affected (0.00 sec)
  5. obclient>INSERT ALL
  6. WHEN c2 > 1 THEN INTO t1 VALUES(1,1,1) INTO t2 VALUES(4,4,4)
  7. when c3 > 1 THEN INTO t2 VALUES(2,2,2)
  8. ELSE INTO t1 VALUES(3,3,3) SELECT c2,c3 FROM t;
  9. Query OK, 2 rows affected (0.01 sec)
  10. Records: 2 Duplicates: 0 Warnings: 0
  11. obclient>SELECT * FROM t1;
  12. +----+------+------+
  13. | C1 | C2 | C3 |
  14. +----+------+------+
  15. | 1 | 1 | 1 |
  16. +----+------+------+
  17. 1 row in set (0.00 sec)
  18. obclient>SELECT * FROM t2;
  19. +------+------+------+
  20. | C1 | C2 | C3 |
  21. +------+------+------+
  22. | 4 | 4 | 4 |
  23. | 2 | 2 | 2 |
  24. +------+------+------+
  25. 2 rows in set (0.00 sec)