暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

OceanBase Cloud快速入门第32期:如何插入数据?

欢迎访问OceanBase官网获取更多信息:https://www.oceanbase.com/



表创建后,可以使用 INSERT 语句或其他语句向表中插入行记录。本文介绍了相关语句的使用方法和示例。

数据插入准备

在插入数据前,请确认以下事项:

  • 请确认您已连接到数据库的 MySQL 租户,连接数据库的操作请参见 连接数据库

    说明

    当前登录租户所属的租户模式可以由 sys 租户通过查询 oceanbase.DBA_OB_TENANTS 视图进行确认。

  • 请确认您已拥有待操作的表的 INSERT 权限。

使用 INSERT 语句插入数据

请使用 INSERT 语句,再参考下面的建议,向表中插入数据。

INSERT 语句的语法格式如下:

INSERT INTO table_name (list_of_columns) VALUES (list_of_values);
参数是否必填描述
table_name指定需要插入数据的表
(list_of_columns)指定表中需要插入数据的列
(list_of_values)list_of_columns 提到的列的对应值,必须一一对应。

插入数据建议

  • 插入数据前,建议了解表的所有列信息,包括列类型、有效值以及是否允许为 NULL 等。

    查看列信息可以通过 DESC 语句查看。

    obclient [test]> DESC test;
    +-------+---------+------+-----+---------+-------+
    | Field | Type    | Null | Key | Default | Extra |
    +-------+---------+------+-----+---------+-------+
    | col1  | int(11) | NO   |     | NULL    |       |
    | col2  | int(11) | YES  |     | NULL    |       |
    +-------+---------+------+-----+---------+-------+
    2 rows in set
    
    • 如果列属性为 NOT NULL

      • 如果列属性有默认值,则可以在插入时不指定该列的值,系统会在该列上插入默认值。

      • 如果列属性无默认值,则插入时必须指定该列的值。

    • 如果列属性为 NULL,则可以在插入时不指定该列的值,系统会在该列上插入一个 NULL 值。

  • 插入数据前,建议了解表上列的约束定义情况,避免插入数据时报错。

    NOT NULLPRIMARY KEY 约束、UNIQUE 约束均可以通过 DESC 语句查看,FOREIGN KEYCHECK 约束可以通过查询 information_schema.TABLE_CONSTRAINTS 视图进行查看。

插入单行数据

通过 INSERT 语句可以插入单行数据。如果需要插入多条记录,可以执行多个单行插入语句来实现。如果需要批量插入,可参考 批量插入多行数据 进行操作。

假设待插入数据的表信息如下:

obclient [test]> CREATE TABLE t_insert(
    id int NOT NULL PRIMARY KEY,
    name varchar(10) NOT NULL, 
    value int,
    gmt_create DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
 );
Query OK, 0 rows affected 

其中,表的 id 列、name 列不能为空,且 id 列为主键列,满足唯一性约束要求,不能有重复的值; gmt_create 列指定了默认值。

示例 1:使用多个单行插入语句插入多行数据。

由于 gmt_create 列指定了默认值,在插入数据时可以不指定默认值。

obclient [test]> INSERT INTO t_insert(id, name, value) 
VALUES (1,'CN',10001);
Query OK, 2 rows affected

obclient [test]> INSERT INTO t_insert(id, name, value) 
VALUES(2,'US', 10002);
Query OK, 2 rows affected

注意,如果 gmt_create 列未指定默认值,则在插入数据时,必须指定值,语句如下。

obclient [test]> INSERT INTO t_insert(id, name, value, gmt_create)
 VALUES (3,'EN', 10003, current_timestamp ());
Query OK, 1 row affected 

批量插入多行数据

在插入数据时,如果要插入多条记录,也可以用一个 INSERT 语句包含多个 VALUES 来批量插入。单个多行插入语句比多个单行插入语句要快。

示例 1 中的操作,又可以通过以下语句来完成。

示例 2:批量插入多行数据。

obclient [test]> INSERT INTO t_insert(id, name, value) 
  VALUES (1,'CN',10001),(2,'US', 10002);
Query OK, 2 rows affected

此外,当需要备份表数据或者将一个表的全部记录拷贝到另一个表时,可以使用查询语句 INSERT INTO ... SELECT ... FROM 充当 INSERT 的 values 子句进行批量插入。

示例 3:将表 t_insert 中的全部数据备份到 t_insert_bak 表中。

obclient [test]> SELECT * FROM t_insert;
+----+------+-------+---------------------+
| id | name | value | gmt_create          |
+----+------+-------+---------------------+
|  1 | CN   | 10001 | 2022-10-12 15:17:17 |
|  2 | US   | 10002 | 2022-10-12 16:29:16 |
|  3 | EN   | 10003 | 2022-10-12 16:29:26 |
+----+------+-------+---------------------+
3 rows in set

obclient [test]> CREATE TABLE t_insert_bak(
    id number NOT NULL PRIMARY KEY,
    name varchar(10) NOT NULL, 
    value number,
    gmt_create DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
 );
Query OK, 0 rows affected 

obclient [test]> INSERT INTO t_insert_bak SELECT * FROM t_insert;
Query OK, 2 rows affected

obclient [test]> SELECT * FROM t_insert_bak;
+----+------+-------+---------------------+
| id | name | value | gmt_create          |
+----+------+-------+---------------------+
|  1 | CN   | 10001 | 2022-10-12 15:17:17 |
|  2 | US   | 10002 | 2022-10-12 16:29:16 |
|  3 | EN   | 10003 | 2022-10-12 16:29:26 |
+----+------+-------+---------------------+
3 rows in set

避免唯一性约束冲突

当表上有唯一性约束的时候,插入相同的记录,数据库会报错。报错信息如下:

obclient [test]> INSERT INTO t_insert(id, name, value) VALUES (3,'UK', 10003),(4, 'JP', 10004);
ERROR 1062 (23000): Duplicate entry '3' for key 'PRIMARY'

该报错可以通过 INSERT IGNORE INTO 语句或 INSERT INTO ON DUPLICATE KEY UPDATE 语句来避免。

示例:

  • 通过 INSERT IGNORE INTO 语句避免约束冲突时,IGNORE 关键字可以忽略由于约束冲突导致的 INSERT 失败的影响。

    obclient [test]> INSERT IGNORE INTO t_insert(id, name, value) 
        VALUES (3,'UK', 10003),(4, 'JP', 10004);
    Query OK, 1 row affected 
    
    obclient [test]> SELECT * FROM t_insert;
    +----+------+-------+---------------------+
    | id | name | value | gmt_create          |
    +----+------+-------+---------------------+
    |  1 | CN   | 10001 | 2022-10-12 15:17:17 |
    |  2 | US   | 10002 | 2022-10-12 16:29:16 |
    |  3 | EN   | 10003 | 2022-10-12 16:29:26 |
    |  4 | JP   | 10004 | 2022-10-12 17:02:52 |
    +----+------+-------+---------------------+
    4 rows in set
    

    示例中,使用了 INSERT IGNORE INTO 语句,(3,'UK', 10003) 这一行数据插入失败,但系统未再报错。

    注意

    该方法仅忽略报错数据,并不会影响实际插入行为。

  • 通过 INSERT INTO ON DUPLICATE KEY UPDATE 语句避免约束冲突时,可以指定对重复主键或唯一键的后续处理。

    说明


    • 指定 ON DUPLICATE KEY UPDATE column_name = expr :当要插入的主键或唯一键有重复时,可以使用 column_name = expr 赋值语句来更新表中冲突行的数据。 column_name = expr 赋值语句可以为冲突行赋某一列或几列的值。赋多列值时,列与列之间用逗号分隔。
    • 不指定 ON DUPLICATE KEY UPDATE column_name = expr :当要插入的主键或唯一键有重复时,插入数据时,系统会报错。


    obclient [test]> INSERT INTO t_insert(id, name, value) VALUES (3,'UK', 10003),(5, 'CN', 10005) ON DUPLICATE KEY UPDATE name = VALUES(name);
    Query OK, 1 row affected 
    
    obclient [test]> SELECT * FROM t_insert;
    +----+------+-------+---------------------+
    | id | name | value | gmt_create          |
    +----+------+-------+---------------------+
    |  1 | CN   | 10001 | 2022-10-12 16:29:16 |
    |  2 | US   | 10002 | 2022-10-12 15:17:17 |
    |  3 | UK   | 10003 | 2022-10-12 16:29:26 |
    |  4 | JP   | 10004 | 2022-10-12 17:02:52 |
    |  5 | CN   | 10005 | 2022-10-12 17:27:46 |
    +----+------+-------+---------------------+
    5 rows in set
    

    示例中,ON DUPLICATE KEY UPDATE name = VALUES(name) 即表示当插入的数据与表中的主键值有重复时,将表中冲突行原数据中 (3,'EN', 10003) 的 name 列的值更新为当前待插入的 name 列的数据。其他不冲突的行,则正常插入。

使用其他语句插入数据

除了 INSERT 语句,当表中无数据记录,或者表中有数据记录但无主键或唯一键冲突时,还可以使用 REPLACE INTO 语句代替 INSERT 语句插入数据。

示例:

  • 创建 t_replace 表后,使用 REPLACE INTO 语句插入数据。

    obclient [test]> CREATE TABLE t_replace(
        id int NOT NULL PRIMARY KEY
        , name varchar(10) NOT NULL
        , value int
        ,gmt_create timestamp NOT NULL DEFAULT current_timestamp
    );
    Query OK, 0 rows affected 
    
    obclient [test]> REPLACE INTO t_replace VALUES(1,'CN',2001, current_timestamp ());
    Query OK, 1 row affected 
    
    obclient [test]> SELECT * FROM t_replace;
    +----+------+-------+---------------------+
    | id | name | value | gmt_create          |
    +----+------+-------+---------------------+
    |  1 | CN   |  2001 | 2022-11-23 09:52:44 |
    +----+------+-------+---------------------+
    1 row in set 
    
  • 在有数据记录的表 t_replace 中,使用 REPLACE INTO 语句插入数据。

    obclient [test]> SELECT * FROM t_replace;
    +----+------+-------+---------------------+
    | id | name | value | gmt_create          |
    +----+------+-------+---------------------+
    |  1 | CN   |  2001 | 2022-03-22 16:13:55 |
    +----+------+-------+---------------------+
    1 row in set 
    
    obclient [test]> REPLACE INTO t_replace values(2,'US',2002, current_timestamp ());
    Query OK, 1 row affected
    
    obclient [test]> SELECT * FROM t_replace;
    +----+------+-------+---------------------+
    | id | name | value | gmt_create          |
    +----+------+-------+---------------------+
    |  1 | CN   |  2001 | 2022-11-23 09:52:44 |
    |  2 | US   |  2002 | 2022-11-23 09:53:05 |
    +----+------+-------+---------------------+
    2 rows in set
    



欢迎访问OceanBase官网获取更多信息:https://www.oceanbase.com/

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论