このドキュメントでは、OBKV-Tableの書き込み機能について説明します。OBKV-Table Javaクライアントは、インデックス組織テーブルおよびヒープ組織テーブルの単一行データ書き込みと一括データ書き込みをサポートしています。業務ニーズに応じて対応するインターフェースを選択し、データを書き込むことができます。
書き込み可能なインターフェース
ObTableClientが書き込みをサポートするインターフェースは以下のとおりです。
インターフェース |
説明 |
注意事項 |
|---|---|---|
insert(String tableName) |
1行のデータを書き込む | 主キーが競合する場合、書き込みに失敗します |
insertOrUpdate(String tableName) |
1行のデータを書き込むか更新する | |
replace(String tableName) |
1行のデータを置き換える | 古い行が存在しない場合、新しい行を書き込みます |
put(String tableName) |
1行のデータを上書きする |
|
書き込みの例
前提条件
書き込み前に、以下の準備が必要です:
- ObTableClientの初期化が完了していること。
- データベース内にインデックス組織テーブルまたはヒープ組織テーブルが作成されていること。例:
-- インデックス組織テーブル CREATE TABLE IF NOT EXISTS `employees` ( `employeeId` int NOT NULL, `name` varchar(100) NOT NULL, `department` varchar(50), `position` varchar(50), `workYear` int, `comment` varchar(100), PRIMARY KEY (`employeeId`) ) PARTITION BY KEY(`employeeId`) PARTITIONS 97; -- ヒープ組織テーブル CREATE TABLE test ( c1 bigint, c2 varchar(20), c3 bigint, UNIQUE INDEX idx_unique_c1 (c1) -- 一意インデックスを作成するとクエリが高速化されます ) ORGANIZATION = HEAP PARTITION BY KEY(c1) PARTITIONS 97; -- ORGANIZATIONパラメータでヒープテーブルを指定
その他の説明は以下の通りです:
- JSON型がサポートされています。詳細な説明と書き込み例については、OBKV-Table データ型を参照してください。
単一行の書き込み
以下のサンプルコードは、ObTableClientを使用して単一行のデータを書き込む方法を示しています。
insert
サンプルコードでは、一行のデータを書き込んでいます。主キー employeeId は 1001 で、4つの属性列が書き込まれています。
private static void insertRow(ObTableClient obkvHandle) throws Exception {
Row rowKey = row().add(colVal("employeeId", 1001));
Row properties = row().add(colVal("name", "zhangsan"))
.add(colVal("department", "R&D"))
.add(colVal("position", "dev"))
.add(colVal("workYear", 10));
obkvHandle.insert("employees")
.setRowKey(rowKey)
.addMutateRow(properties)
.execute();
}
この例では、insert インターフェースを使用してヒープテーブルに単一行を挿入する方法を示します。ヒープテーブルへの書き込み操作では、データが正しくルーティングされるよう、setPartitionKey インターフェースでパーティションキーの値を設定する必要がある点に注意してください。
@Test
public void testSingleInsert() throws Exception {
try {
// データの挿入
// パーティションキー c1 の値は setPartitionKey を使用して設定する必要があります。
// c1 の値は addMutateColVal を使用して設定する必要もあります。
MutationResult result = client.insert("test")
.setPartitionKey(row(colVal("c1", 1000L)))
.addMutateColVal(colVal("c1", 1000L), colVal("c2", "test1"), colVal("c3", 3000L))
.execute();
assertEquals("Insert should affect 1 row", 1, result.getAffectedRows());
System.out.println("Single insert successful: " + result + " row affected");
} finally {
// データのクリア
truncateTable();
}
}
insertOrUpdate
サンプルコードは、ObTableClientを使用して行データを書き込んだり更新したりする方法を示しています。主キーemployeeIdが1001の行に、4つの属性列を書き込みます。
private static void insertOrUpdateRow(ObTableClient obkvHandle) throws Exception {
Row rowKey = row().add(colVal("employeeId", 1001));
Row properties = row().add(colVal("name", "zhangsan"))
.add(colVal("department", "R&D"))
.add(colVal("position", "dev"))
.add(colVal("workYear", 10));
obkvHandle.insertOrUpdate("employees")
.setRowKey(rowKey)
.addMutateRow(properties)
.execute();
}
この例では、insertOrUpdate インターフェースを使用してヒープテーブルに対する単一行の挿入または更新を行う方法を示します。ヒープテーブルへの書き込み操作では、データが正しくルーティングされるように、setPartitionKey インターフェースでパーティションキーの値を設定する必要がある点に注意してください。
@Test
public void testSingleInsertOrUpdate1() throws Exception {
try {
// データの挿入
// パーティションキー c1 の値を setPartitionKey で設定する必要があります。
// また、c1 の値は addMutateColVal で設定する必要があります。
MutationResult result = client.insertOrUpdate(tableName)
.setPartitionKey(row(colVal("c1", 1000L)))
.addMutateColVal(colVal("c1", 1000L), colVal("c2", "test1"), colVal("c3", 3000L))
.execute();
assertEquals("Insert should affect 1 row", 1, result.getAffectedRows());
System.out.println("Single insertOrUpdate successful: " + result + " row affected");
} finally {
// データのクリア
truncateTable();
}
}
replace
サンプルコードは、ObTableClientを使用して1行のデータを置き換える方法を示しています。主キーemployeeIdが1001で、4つの属性列が書き込まれています。
private static void replaceRow(ObTableClient obkvHandle) throws Exception {
Row rowKey = row().add(colVal("employeeId", 1001));
Row properties = row().add(colVal("name", "zhangsan"))
.add(colVal("department", "R&D"))
.add(colVal("position", "dev"))
.add(colVal("workYear", 10));
obkvHandle.replace("employees")
.setRowKey(rowKey)
.addMutateRow(properties)
.execute();
}
この例では、replace インターフェースを使用してヒープテーブルの単一行を置き換える方法を示します。ヒープテーブルの置き換え操作では、データが正しくルーティングされるように、setPartitionKey インターフェースでパーティションキーの値を設定する必要がある点に注意してください。
@Test
public void testSingleReplace1() throws Exception {
try {
// データの挿入
// パーティションキー c1 の値は setPartitionKey で設定する必要があります。
// c1 の値は addMutateColVal でも設定する必要があります。
MutationResult result = client.replace(tableName)
.setPartitionKey(row(colVal("c1", 1000L)))
.addMutateColVal(colVal("c1", 1000L), colVal("c2", "test1"), colVal("c3", 3000L))
.execute();
assertEquals("Insert should affect 1 row", 1, result.getAffectedRows());
System.out.println("Single replace successful: " + result + " row affected");
} finally {
// データのクリア
truncateTable();
}
}
put
注意
このインターフェースはヒープ組織テーブルをサポートしていません。
サンプルコードは、ObTableClientを使用してインデックス組織テーブルに1行のデータを上書きする方法を示しています。主キーemployeeIdが1001で、4つの属性列が書き込まれています。
private static void putRow(ObTableClient obkvHandle) throws Exception {
Row rowKey = row().add(colVal("employeeId", 1001));
Row properties = row().add(colVal("name", "zhangsan"))
.add(colVal("department", "R&D"))
.add(colVal("position", "dev"))
.add(colVal("workYear", 1))
.add(colVal("comment", "new employee"));
obkvHandle.put("employees")
.setRowKey(rowKey)
.addMutateRow(properties)
.execute();
}
バッチ書き込み
以下のサンプルコードは、ObTableClientを使用してデータをバッチで書き込む方法を示しています。
batchInsert
サンプルコードでは、1バッチに2行のデータを書き込みます。主キー employeeId はそれぞれ 1001 と 1002 で、各行には4つの属性列が書き込まれます。
private static void batchInsertRow(ObTableClient obkvHandle) throws Exception {
Row rowKey1 = row().add(colVal("employeeId", 1001));
Row rowKey2 = row().add(colVal("employeeId", 1002));
Row properties1 = row().add(colVal("name", "zhangsan"))
.add(colVal("department", "R&D"))
.add(colVal("position", "dev"))
.add(colVal("workYear", 10));
Row properties2 = row().add(colVal("name", "lisi"))
.add(colVal("department", "R&D"))
.add(colVal("position", "dev"))
.add(colVal("workYear", 5));
Insert insertOp1 = insert().setRowKey(rowKey1).addMutateRow(properties1);
Insert insertOp2 = insert().setRowKey(rowKey2).addMutateRow(properties2);
BatchOperationResult res = obkvHandle.batchOperation("employees")
.addOperation(insertOp1,insertOp2)
.execute();
System.out.println(res.hasError());
}
この例では、batchInsert インターフェースを使用してヒープテーブルにバッチ書き込みを行う方法を示します。ヒープテーブルへの書き込み操作では、データが正しくルーティングされるよう、setPartitionKey インターフェースを使用してパーティションキーの値を設定する必要があります。
@Test
public void testBatchInsert() throws Exception {
try {
// BatchOperationを使用したバッチ挿入
BatchOperation batch = client.batchOperation("test");
// 複数の挿入操作を追加
// パーティションキー c1 の値は setPartitionKey を使用して設定する必要があることに注意してください。
// c1 の値は addMutateColVal を使用しても設定する必要があります。
for (int i = 1; i <= 3; i++) {
Insert insert = new Insert();
insert.setPartitionKey(row(colVal("c1", (long)(1000 + i))))
.addMutateColVal(colVal("c1", (long)(1000 + i)), colVal("c2", "batch_test" + i), colVal("c3", (long)(3000 + i)));
batch.addOperation(insert);
}
batch.execute();
System.out.println("Batch insert successful: 3 operations executed");
} finally {
// データのクリア
truncateTable();
}
}
batchInsertOrUpdate
サンプルコードでは、1バッチに2行のデータを書き込んでいます。主キーemployeeIdはそれぞれ1001と1002で、各行には4つの属性列が書き込まれています。
private static void batchInsertOrUpdateRow(ObTableClient obkvHandle) throws Exception {
Row rowKey1 = row().add(colVal("employeeId", 1001));
Row rowKey2 = row().add(colVal("employeeId", 1002));
Row properties1 = row().add(colVal("name", "zhangsan"))
.add(colVal("department", "R&D"))
.add(colVal("position", "dev"))
.add(colVal("workYear", 10));
Row properties2 = row().add(colVal("name", "lisi"))
.add(colVal("department", "R&D"))
.add(colVal("position", "dev"))
.add(colVal("workYear", 5));
InsertOrUpdate insertUpOp1 = insertOrUpdate().setRowKey(rowKey1).addMutateRow(properties1);
InsertOrUpdate insertUpOp2 = insertOrUpdate().setRowKey(rowKey2).addMutateRow(properties2);
BatchOperationResult res = obkvHandle.batchOperation("employees")
.addOperation(insertUpOp1,insertUpOp2)
.execute();
System.out.println(res.hasError());
}
この例では、batchInsertOrUpdate インターフェースを使用して、ヒープテーブルに対して一括書き込みまたは更新を行う方法を示します。ヒープテーブルへの書き込み操作では、データが正しくルーティングされるよう、setPartitionKey インターフェースを使用してパーティションキーの値を設定する必要がある点に注意してください。
@Test
public void testBatchInsertOrUpdate1() throws Exception {
try {
// BatchOperationを使用した一括挿入
BatchOperation batch = client.batchOperation(tableName);
// 複数の挿入操作を追加
// パーティションキーc1の値をsetPartitionKeyで設定する必要があります。
// 同様に、addMutateColValを使用してc1の値も設定する必要があります。
for (int i = 1; i <= 3; i++) {
InsertOrUpdate insertOrUpdate = new InsertOrUpdate();
insertOrUpdate.setPartitionKey(row(colVal("c1", (long)(1000 + i))))
.addMutateColVal(colVal("c1", (long)(1000 + i)), colVal("c2", "batch_test" + i), colVal("c3", (long)(3000 + i)));
batch.addOperation(insertOrUpdate);
}
batch.execute();
System.out.println("Batch insertOrUpdate successful: 3 operations executed");
} finally {
// データのクリア
truncateTable();
}
}
batchReplace
サンプルコードでは、1バッチに2行のデータを書き込みます。主キーemployeeIdはそれぞれ1001と1002で、各行には4つの属性列が書き込まれています。
private static void batchReplaceRow(ObTableClient obkvHandle) throws Exception {
Row rowKey1 = row().add(colVal("employeeId", 1001));
Row rowKey2 = row().add(colVal("employeeId", 1002));
Row properties1 = row().add(colVal("name", "zhangsan"))
.add(colVal("department", "R&D"))
.add(colVal("position", "dev"))
.add(colVal("workYear", 10));
Row properties2 = row().add(colVal("name", "lisi"))
.add(colVal("department", "R&D"))
.add(colVal("position", "dev"))
.add(colVal("workYear", 5));
Replace replaceOp1 = replace().setRowKey(rowKey1).addMutateRow(properties1);
Replace replaceOp2 = replace().setRowKey(rowKey2).addMutateRow(properties2);
BatchOperationResult res = obkvHandle.batchOperation("employees")
.addOperation(replaceOp1,replaceOp2)
.execute();
System.out.println(res.hasError());
}
この例では、batchReplace インターフェースを使用してヒープテーブルの行を一括で置き換える方法を示します。ヒープテーブルの置き換え操作では、データが正しくルーティングされるように、setPartitionKey インターフェースでパーティションキーの値を設定する必要がある点に注意してください。
@Test
public void testBatchReplace1() throws Exception {
try {
// BatchOperationを使用した一括挿入
BatchOperation batch = client.batchOperation(tableName);
// 複数のreplace操作を追加
// パーティションキーc1の値はsetPartitionKeyで設定する必要があります。
// c1の値はaddMutateColValでも設定する必要があります。
for (int i = 1; i <= 3; i++) {
Replace replace = new Replace();
replace..setPartitionKey(row(colVal("c1", (long)(1000 + i))))
.addMutateColVal(colVal("c1", (long)(1000 + i)), colVal("c2", "batch_test" + i), colVal("c3", (long)(3000 + i)));
batch.addOperation(replace);
}
batch.execute();
System.out.println("Batch replace successful: 3 operations executed");
} finally {
// データのクリア
truncateTable();
}
}
batchPut
注意
このインターフェースはヒープ組織テーブルをサポートしていません。
サンプルコードでは、1バッチで2行のデータを書き込みます。主キー employeeId はそれぞれ 1001 と 1002 で、各行にはテーブルの全5つの属性列がすべて書き込まれます。
private static void batchPutRow(ObTableClient obkvHandle) throws Exception {
Row rowKey1 = row().add(colVal("employeeId", 1001));
Row rowKey2 = row().add(colVal("employeeId", 1002));
Row properties1 = row().add(colVal("name", "zhangsan"))
.add(colVal("department", "R&D"))
.add(colVal("position", "dev"))
.add(colVal("workYear", 1))
.add(colVal("comment", "new employee"));
Row properties2 = row().add(colVal("name", "lisi"))
.add(colVal("department", "R&D"))
.add(colVal("position", "dev"))
.add(colVal("workYear", 1))
.add(colVal("comment", "new employee"));
Put putOp1 = put().setRowKey(rowKey1).addMutateRow(properties1);
Put putOp2 = put().setRowKey(rowKey2).addMutateRow(properties2);
BatchOperationResult res = obkvHandle.batchOperation("employees")
.addOperation(putOp1,putOp2)
.execute();
System.out.println(res.hasError());
}