Skip to content

单行操作接口

vanson edited this page Aug 1, 2024 · 12 revisions

1. insert

insert 提供单行数据插入的语义,必须指定主键列插入,对于非指定的非主键列,会插入默认值。

Insert insert tableClient.insert("test_table")
                   	 .setRowKey(row(colVal("c1", 0L), colVal("c2", "row_0")))
              	   	 .addMutateColVal(colVal("c3", new byte[]{1}))
              	         .addMutateColVal(colVal("c4", 100L))
MutationResult result = insert.execute();
System.out.println("insert " + (result.getAffectedRows()) + " rows!");
  • setRowKey: 指定插入行的主键
  • setFilter: 指定插入的条件,如果指定的行满足条件,才会做插入操作 1.2.2 Release Notes
  • addMutateColVal: 指定插入的非主键列的值,可以多次调用添加所有需要插入的非主键列的值
  • MutationResult: insert 操作 execute 之后返回的结果,可以通过 getAffectedRows 接口获取写入的条数

2. update

update 提供单行数据更新的语义,必须指定主键列,同时可以做条件更新,对非主键列指定条件,满足条件才做更新操作 // update

Update update = tableClient.update("test_table")					
                           .setRowKey(colVal("c1", 1001L))
			   .setFilter(compareVal(ObCompareOp.EQ, "c3", "singleUpset"))
			   .addMutateColVal(colVal("c3", "updateWithCondition"))
MutationResult result = update.execute();
System.out.println("update " + result.getAffectedRows() + " row!");
  • setRowKey: 指定需要更新行的主键
  • addMutateColVal: 指定需要更新的非主键列,可以多次调用添加所有需要更新的非主键列的值
  • setFilter: 指定更新的条件,如果指定的行满足条件,才会做更新操作
  • MutationResult: update 操作 execute 之后返回的结果,可以通过 getAffectedRows 接口获取 update 更新的行数

3. delete

delete 提供单行数据删除的语义,必须指定主键列,同时可以做条件删除,对非主键列指定条件,满足条件才删除该行

Delete delete = tableClient.delete("test_table")
          		   .setRowKey(colVal("c1", 2L), colVal("c2", "row_2"))
          		   .setFilter(compareVal(ObCompareOp.EQ, "c4", 103L))
          		   .execute();
MutationResult result = delete.execute();
System.out.println("delete " + result.getAffectedRows() + " row!");
  • setRowKey: 指定需要删除行的主键
  • setFilter: 指定删除的条件,如果指定的行满足条件,才会做删除操作
  • MutationResult: delete 操作 execute 之后返回的结果,可以通过 getAffectedRows 接口获取删除的行数

4. insertOrUpdate

insertOrUpdate 提供插入或者更新的语义,必须指定主键列,如果该行不存在,插入该行,如果存在,更新已有行。

InsertOrUpdate insertOrUpdate = tableClient.insertOrUpdate("test_table")
          				   .setRowKey(colVal("c1", 4L), colVal("c2", "row_4"))
          				   .addMutateRow(row(colVal("c3", new byte[]{2}), colVal("c4", 104L)))
MutationResult result = insertOrUpdate.execute();
System.out.println("insertOrUpdate " + result.getAffectedRows() + " row!");
  • setRowKey: 指定需要操作行的主键
  • addMutateRow: 添加需要插入或更新的行
  • MutationResult: delete 操作 execute 之后返回的结果,可以通过 getAffectedRows 接口获取删除的行数

PS: 由于insertOrUpdate有可能是做insert操作,因此需要保证带有not null属性的列都填了值,除非这个列还带有default value属性

5. replace

replace 插入或者替换的语义,必须指定主键列,如果该行不存在,插入该行,如果该行存在,会删除原来的行重新插入。同时,如果有唯一索引冲突,也会删除所有冲突的行。

Replace replace = tableClient.replace("test_table")
      	   		     .setRowKey(colVal("c1", 2L), colVal("c2", "row_2"))
      	   		     .addMutateRow(row(colVal("c3", new byte[]{2}), colVal("c4", 202L)));
MutationResult result = replace.execute();
System.out.println("replace " + result.getAffectedRows() + " row!");
  • setRowKey: 指定需要操作行的主键
  • addMutateRow: 添加操作的行
  • MutationResult: replace 操作 execute 之后返回的结果,可以通过 getAffectedRows 接口获取 replace 操作影响的行数,因为会删除旧行,所以可能大于 1

PS: 相对与 insertOrUpdate,replace 在行存在的时候,重新插入新行,那么 replace 操作中未指定的列将使用默认值插入,而 insertOrUpdate 只会更新操作中指定的列,其他列保持不变。

6. increment

increment 提供对整型列增加一个增加值的语义,必须指定主键列,以及需要增加值的列。如果指定的行不存在,插入该行,并将做 increment 的列的初始化设置为增量值,如果该行存在并且需要做 increment 的列的当前值为 NULL,将该列的值更新为增量值。 increment 也支持提供条件,如果指定条件,只有该行满足条件时,才会做 increment 操作。

Increment increment = tableClient.inrement("test_table")
      	   			 .setRowKey(colVal("c1", 2L), colVal("c2", "row_2"))
      	   			 .addMutateColVal(colVal("c4", 202L))
                        	 .setFilter(compareVal(ObCompareOp.EQ, "c3", new byte[]{2}));
MutationResult result = increment.execute();
System.out.println("increment " + result.getAffectedRows() + " row!");
  • setRowKey: 指定需要操作行的主键
  • addMutateRow: 添加需要做 increment 的列与增量值,只支持整型列
  • setFilter: 指定做 increment 操作的条件
  • MutationResult: increment 操作 execute 之后返回的结果,可以通过 getAffectedRows 接口获取 increment 操作影响的行数

7. append

append 提供对字符类型列追加某个字符串,必须指定主键列,以及需要追加字符串的列。如果指定的行不存在,插入该行,并将做 append 的列的初始化设置为追加串,如果该行存在并且需要做 apend 的列的当前值为 NULL,将该列的值更新为追加串。 append 也支持提供条件,如果指定条件,只有该行满足条件时,才会做 append 操作。

Append append = tableClient.append("test_table")
      	   		   .setRowKey(colVal("c1", 2L), colVal("c2", "row_2"))
      	   		   .addMutateColVal(colVal("c3", new byte[]{2}))
			   .setFilter(compareVal(ObCompareOp.EQ, "c4", 104L));
MutationResult result = append.execute();
System.out.println("append " + result.getAffectedRows() + " row!");
  • setRowKey: 指定需要操作行的主键
  • addMutateRow: 添加需要做 append 的列与追加值,只支持 varbinary/varchar 类型
  • setFilter: 指定做 append 操作的条件
  • MutationResult: append 操作 execute 之后返回的结果,可以通过 getAffectedRows 接口获取 append 操作影响的行数

8. put

put 提供覆盖写的语义,必须指定主键列,如果该行不存在,插入该行,如果存在,覆盖已有行。

注意: put接口有以下约束

  • 在binlog_row_image被设置成FULL时,不允许使用put row,会报错OB_NOT_SUPPORTED
  • 表中有索引时(本地索引或全局索引),不允许使用put,会报错OB_NOT_SUPPORTED。
  • 使用put时,如果没有填全列,缺省的列将会使用默认值填充,如果列中没有默认值,将会报错。
Put put = client.put("test_table")
                .setRowKey(colVal("c1", 4L), colVal("c2", "row_4"))
                .addMutateRow(row(colVal("c3", new byte[]{2}), colVal("c4", 104L)));
MutationResult result = put.execute();
System.out.println("put " + result.getAffectedRows() + " row!");
  • setRowKey: 指定需要操作行的主键
  • addMutateRow: 除主键外的其他普通列
  • MutationResult: put 操作 execute 之后返回的结果,可以通过 getAffectedRows 接口获取写入的行数

9. checkAndInsUp

checkAndInsUp 提供条件更新的语义。在 checkExist 参数为 true 的时候,如果有符合条件的行存在,则执行给定的 insertUp 操作,否则什么都不做。在 checkExist 参数为 false 的时候,如果没有符合条件的行存在,则执行给定的 insertUp 操作,否则什么都不做。

public CheckAndInsUp checkAndInsUp(String tableName, ObTableFilter filter,
                                   InsertOrUpdate insUp, boolean checkExists); 
  • tableName: 操作的表名
  • filter: check 的 filter 条件。check 的行是 inserUp 中给定的行,即每次最多 check 一行
  • insertUp: check 通过后需要执行的操作
  • checkExists: 默认为 true。值为 true 的时候表示满足条件的行存在时,执行 checkAndInsUp 操作;为 false 的时候表示满足条件的行不存在时,则执行给定的 insertUp 操作

示例: 如果存在主键为 (1L, "c2_v0") 的行,并且满足条件 c3 >= "c3_v0",那么执行 insertUp 操作,将 c3, c4 覆盖写为 ("c3_v0", 200L)

InsertOrUpdate insertOrUpdate = new InsertOrUpdate();
insertOrUpdate.setRowKey(row(colVal("c1", 1L), colVal("c2", "c2_v0")));
insertOrUpdate.addMutateRow(row(colVal("c3", "c3_v0"), colVal("c4", 200L)));
ObTableFilter filter = compareVal(ObCompareOp.GE, "c3", "c3_v0");
CheckAndInsUp checkAndInsUp = client.checkAndInsUp("test_table", filter, insertOrUpdate, true);
MutationResult result = checkAndInsUp.execute();
System.out.println("checkAndInsUp " + result.getAffectedRows() + " row!");

PS: 该操作也可以放到 batch 中批量执行,但是当前不支持混合其他操作执行。

Clone this wiki locally