全部产品
存储与CDN 数据库 安全 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网 钉钉智能硬件

INSERT

更新时间:2017-06-07 13:26:11

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

格式

INSERT [INTO] tblname 
      [(colname,...)] 
      {VALUES|VALUE} ({expr | DEFAULT},...)
      [ ON DUPLICATE KEY UPDATE
       colname=expr
      [, colname=expr] ... ] ;

或者

INSERT [INTO] tblname
         [(colname,...)]
        {VALUES|VALUE} (colvalues,...)
        [ON DUPLICATE KEY UPDATE
          colname=expr
         [, colname=expr] ... ] ;
  • [(colname,...)]用于指定插入数据的列。

  • 同时插入多列时,用“,”隔开。

  • 支持ON DUPLICATE KEY UPDATE

  • Insert语句后面不支持set操作

INSERT…ON DUPLICATE KEY UPDATE… 语句执行,affect row的计算:

  • 在没有设置client_capabilities 中CLIENT_FOUND_ROWS的情况下:

    • 作为新行插入的话,affected_row= 1;

    • 存在冲突行的情况下,如果更新前后数据相同的话, affected_row = 0; 否则affectd_row = 2;

  • 如果设置了CLIENT_FOUND_ROWS:

    • 作为新行插入的话,affected_row=1;

    • 如果更新前后数据相同的话,affectd_row=1;

    • 如果更新前后数据不相同的话,affected_row=2;

  • CLIENT_FOUND_ROWS的影响在于:不设置CLIENT_FOUND_ROWS的情况下,计算affected_row的值,只计算实际更新了行数,而设置了CLIENT_FOUND_ROWS的话,会把所有touched行数(满足冲突条件的行)都记上,而不管其是否发生了真正的数据修改。

示例

Oceanbase>show create table test;
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                                       |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| test  | CREATE TABLE `test` (
  `a` int(11) DEFAULT NULL,
  `b` int(11) DEFAULT NULL,
  UNIQUE KEY `a_uniq` (`a`) BLOCK_SIZE 16384
) DEFAULT CHARSET = utf8mb4 REPLICA_NUM = 3 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)

Oceanbase>insert into test values(1,2);
Query OK, 1 row affected (0.01 sec)

Oceanbase>insert into test values(1,3);
ERROR 1062 (23000): Duplicate entry '1' for key 'a_uniq'

Oceanbase>insert into test values(1,3) on duplicate key update a = a+1;
Query OK, 2 rows affected (0.01 sec)

Oceanbase>select * from test;
+------+------+
| a    | b    |
+------+------+
|    2 |    2 |
+------+------+
1 row in set (0.01 sec)

注意: 同时插入多个值时,如果这些值在不同的分区,会报错。

Oceanbase>show create table tp;
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                         |
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tp    | CREATE TABLE `tp` (
  `a` int(11) DEFAULT NULL,
  `b` int(11) DEFAULT NULL
) DEFAULT CHARSET = utf8mb4 REPLICA_NUM = 3 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE partition by hash(a) partitions 7 |
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)

Oceanbase>insert into tp values(1,2),(2,3),(3,4);
ERROR 1235 (0A000): Insert data cross partition not supported
本文导读目录