最简单的 INSERT 语句语法格式如下:

其中,list_of_columns 指定表的 table_name 列,list_of_values 是 list_of_columns 提到的列的对应值,必须一一对应。因此,在向一个表插入记录之前,需要了解这个表所有的列信息,以及列类型和有效值、是否允许为空等。在 obclient 命令行环境下,可以直接用 DESC 命令查看列属性,如下所示:

  1. +----------------+-------------+------+-----+---------+-------+
  2. | FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA |
  3. +----------------+-------------+------+-----+---------+-------+
  4. | OL_W_ID | NUMBER(38) | NO | PRI | NULL | NULL |
  5. | OL_D_ID | NUMBER(38) | NO | PRI | NULL | NULL |
  6. | OL_O_ID | NUMBER(38) | NO | PRI | NULL | NULL |
  7. | OL_NUMBER | NUMBER(38) | NO | PRI | NULL | NULL |
  8. | OL_DELIVERY_D | DATE | YES | NULL | NULL | NULL |
  9. | OL_AMOUNT | NUMBER(6,2) | YES | NULL | NULL | NULL |
  10. | OL_I_ID | NUMBER(38) | YES | NULL | NULL | NULL |
  11. | OL_SUPPLY_W_ID | NUMBER(38) | YES | NULL | NULL | NULL |
  12. | OL_QUANTITY | NUMBER(38) | YES | NULL | NULL | NULL |
  13. | OL_DIST_INFO | CHAR(24) | YES | NULL | NULL | NULL |
  14. +----------------+-------------+------+-----+---------+-------+
  15. 10 rows in set (0.01 sec)

当插入多条件记录时,可以分多条 INSERT 语句,也可以用一个 INSERT 多个 VALUES 语句。

如下示例创建有默认值列的表,SQL 插入两笔记录,所有字段信息都有值。

  1. VALUES (2,'US', 10002) ,(3,'EN', 10003);
  2. Query OK, 2 rows affected (0.00 sec)

当表上有唯一性约束的时候,插入相同的记录,数据库会报错,提示 key ‘xxx’ violated。

这个报错可以通过 INSERT IGNORE INTO、MERGE INTO、INSERT INTO ON DUPLICATE KEY UPDATE 避免。

关于INSERT IGNORE INTO 语句

  1. obclient> CREATE TABLE t_insert(
  2. id number NOT NULL PRIMARY KEY
  3. , name varchar(10) NOT NULL
  4. , value number
  5. ,gmt_create timestamp NOT NULL DEFAULT current_timestamp
  6. );
  7. Query OK, 0 rows affected (0.68 sec)
  8. obclient> INSERT INTO t_insert(id, name, value, gmt_create)
  9. VALUES (1,'CN',10001, current_timestamp);
  10. Query OK, 1 row affected (0.01 sec)
  11. obclient> INSERT INTO t_insert(id, name, value)
  12. VALUES (2,'US', 10002),(3,'EN', 10003);
  13. obclient> INSERT INTO t_insert(id, name, value)
  14. VALUES (3,'UK', 10003),(4, 'JP', 10004);
  15. ERROR 1062 (23000): Duplicate entry '3' for key 'PRIMARY'
  16. obclient>
  17. obclient> INSERT IGNORE INTO t_insert(id, name, value)
  18. VALUES (3,'UK', 10003) ,(4, 'JP', 10004);
  19. Query OK, 1 row affected (0.00 sec)
  20. obclient> select * from t_insert;
  21. +----+------+-------+---------------------+
  22. | id | name | value | gmt_create |
  23. +----+------+-------+---------------------+
  24. | 1 | CN | 10001 | 2020-04-03 16:05:45 |
  25. | 2 | US | 10002 | 2020-04-03 16:05:54 |
  26. | 3 | EN | 10003 | 2020-04-03 16:05:54 |
  27. | 4 | JP | 10004 | 2020-04-03 16:06:08 |

当需要备份一个表的备份或者全部记录时,可以使用 INSERT INTO … SELECT … FROM 语句。