表およびリージョンの管理
最初にサンプル表を作成します。その後、表を変更するための様々な方法を学習します。項の最後で、その表を削除します。また、既存のリージョンの表示および特定のリージョンの削除についても学習します。
java -jar lib/kvstore.jar kvlite -secure-config disable
java -jar lib/sql.jar -helper-hosts localhost:5000 -store kvstore
表の変更
- 表スキーマへのスキーマ・フィールドの追加
- 表スキーマからのスキーマ・フィールドの削除
- リージョンの追加
- リージョンの削除
- 表の存続時間値の変更
ノート:
1つのコマンドで指定できる操作のタイプは1つだけです。たとえば、スキーマ・フィールドの削除とTTL値の設定を一緒に行うことはできません。CREATE TABLE demo_acct(
acct_id INTEGER,
acct_data JSON,
PRIMARY KEY(acct_id)
)
ALTER TABLE demo_acct(ADD acct_balance INTEGER)
説明: フィールドを追加しても、表内の既存の行には影響しません。フィールドを追加すると、そのデフォルト値またはNULLが、このフィールドを含まない既存の行で、このフィールドの値として使用されます。追加するフィールドは、最上位フィールド(つまり、表の列)にすることも、階層表スキーマ内で深くネストすることもできます。その結果、フィールドはパスを介して指定されます。
ALTER TABLE demo_acct(DROP acct_balance)
ALTER TABLE demo_acct(DROP acct_id)
Error handling command ALTER TABLE demo_acct(DROP acct_id):
Error: at (1, 27) Cannot remove a primary key field: acct_id
例3: リージョンの追加
add regions句を使用すると、マルチリージョンのOracle NoSQL Database環境で既存の複数リージョン表(MR表)を新しいリージョンとリンクできます。この句を使用して、MR表を新しいリージョンに展開します。
ALTER TABLE <table_name> ADD REGIONS <region_name>
説明: ここで、table_nameはMR表で、region_nameは既存のリージョンです。
例4: リージョンの削除
リージョンの削除句を使用すると、マルチリージョンのOracle NoSQL Database環境で参加リージョンから既存のMR表を切断できます。この句を使用すると、MR表を縮小してリージョンを減らすことができます。
ALTER TABLE <table_name> DROP REGIONS <comma_separated_list_of_regions>
ここで、table_nameはMR表、comma_separated_list_of_regionsは削除されるリージョンのリストです。
例5: 表の存続時間値の変更
存続時間(TTL)のメカニズムを使用すると、表の行に時間枠を設定して、それを経過すると、行が自動的に期限切れになって使用できなくなるようにできまます。デフォルトでは、作成するすべての表のTTL値は、有効期限がないことを示すゼロとなります。
HOURS
またはDAYS
を指定できます。ALTER TABLE demo_acct USING TTL 5 days
ノート:
表のTTL値を変更しても、表の既存の行のTTL値は変更されません。かわりに、表の変更後に作成された行に配置されるデフォルトのTTL値のみが変更されます。表内のすべてのレコードのTTLを変更するには、表の各レコードを反復処理してそのTTL値を更新する必要があります。APIの使用による表の変更:
/**
* Alter the table stream_acct and add a column
*/
private static void alterTab(NoSQLHandle handle) throws Exception {
String alterTableDDL = "ALTER TABLE " + tableName +"(ADD acctname STRING)";
TableRequest treq = new TableRequest().setStatement(alterTableDDL);
System.out.println("Altering table " + tableName);
TableResult tres = handle.tableRequest(treq);
tres.waitForCompletion(handle, 60000, /* wait 60 sec */
1000); /* delay ms for poll */
System.out.println("Table " + tableName + " is altered");
}
def alter_table(handle):
statement = '''ALTER TABLE stream_acct(ADD acctname STRING)'''
request = TableRequest().set_statement(statement)
table_result = handle.do_table_request(request, 40000, 3000)
table_result.wait_for_completion(handle, 40000, 3000)
print('Table stream_acct is altered')
//alter an existing table and add a column
func alterTable(client *nosqldb.Client, err error, tableName string)(){
stmt := fmt.Sprintf("ALTER TABLE %s (ADD acctName STRING)",tableName)
tableReq := &nosqldb.TableRequest{
Statement: stmt,
}
tableRes, err := client.DoTableRequest(tableReq)
if err != nil {
fmt.Printf("cannot initiate ALTER TABLE request: %v\n", err)
return
}
// The alter table request is asynchronous, wait for table alteration to complete.
_, err = tableRes.WaitForCompletion(client, 60*time.Second, time.Second)
if err != nil {
fmt.Printf("Error finishing ALTER TABLE request: %v\n", err)
return
}
fmt.Println("Altered table ", tableName)
return
}
//alter a table and add a column
async function alterTable(handle) {
const alterDDL = `ALTER TABLE ${TABLE_NAME} (ADD acctname STRING)`;
let res = await handle.tableDDL(alterDDL);
console.log('Table altered: ' + TABLE_NAME);
}
private static async Task alterTable(NoSQLClient client){
var sql = $@"ALTER TABLE {TableName}(ADD acctname STRING)";
var tableResult = await client.ExecuteTableDDLAsync(sql);
// Wait for the operation completion
await tableResult.WaitForCompletionAsync();
Console.WriteLine(" Table {0} is altered", tableResult.TableName);
}
表の削除
DROP TABLE demo_acct
ノート:
MR表を削除するには、まずその子表をすべて削除します。そうしないと、DROP文はエラーになります。APIの使用による表の削除:
/*Drop the table*/
private static void dropTab(NoSQLHandle handle) throws Exception {
String dropTableDDL = "DROP TABLE " + tableName;
TableRequest treq = new TableRequest().setStatement(dropTableDDL);
TableResult tres = handle.tableRequest(treq);
tres.waitForCompletion(handle, 60000, /* wait 60 sec */
1000); /* delay ms for poll */
System.out.println("Table " + tableName + " is dropped");
}
def drop_table(handle):
statement = '''DROP TABLE stream_acct'''
request = TableRequest().set_statement(statement)
table_result = handle.do_table_request(request, 40000, 3000)
table_result.wait_for_completion(handle, 40000, 3000)
print('Dropped table: stream_acct')
//drop an existing table
func dropTable(client *nosqldb.Client, err error, tableName string)(){
stmt := fmt.Sprintf("DROP TABLE %s",tableName)
tableReq := &nosqldb.TableRequest{
Statement: stmt,
}
tableRes, err := client.DoTableRequest(tableReq)
if err != nil {
fmt.Printf("cannot initiate DROP TABLE request: %v\n", err)
return
}
// The drop table request is asynchronous, wait for table drop to complete.
_, err = tableRes.WaitForCompletion(client, 60*time.Second, time.Second)
if err != nil {
fmt.Printf("Error finishing DROP TABLE request: %v\n", err)
return
}
fmt.Println("Dropped table ", tableName)
return
}
//drop a table
async function dropTable(handle) {
const dropDDL = `DROP TABLE ${TABLE_NAME}`;
let res = await handle.tableDDL(dropDDL);
console.log('Table dropped: ' + TABLE_NAME);
}
private static async Task dropTable(NoSQLClient client){
var sql = $@"DROP TABLE {TableName}";
var tableResult = await client.ExecuteTableDDLAsync(sql);
// Wait for the operation completion
await tableResult.WaitForCompletionAsync();
Console.WriteLine(" Table {0} is dropped", tableResult.TableName);
}
リージョンの管理
show regions文は、複数リージョンのOracle NoSQL Databaseに存在するリージョンのリストを提供します。出力をJSON形式にする場合は、AS JSONを指定する必要があります。
SHOW REGIONS
SHOW AS JSON REGIONS
ノート:
このリージョンは、コマンドが実行されるローカル・リージョンと異なっている必要があります。DROP REGION my_region1
APIの使用によるリージョンの削除:
/* Drop a table from a region*/
private static void dropTabInRegion(NoSQLHandle handle) throws Exception {
String dropTableDDL = "DROP TABLE " + tableName;
TableRequest treq = new TableRequest().setStatement(dropTableDDL);
TableResult tres = handle.tableRequest(treq);
tres.waitForCompletion(handle, 60000, /* wait 60 sec */
1000); /* delay ms for poll */
System.out.println("Table " + tableName + " is dropped");
}
/* Drop a region*/
private static void dropRegion(NoSQLHandle handle, String regName) throws Exception {
String dropNSDDL = "DROP REGION " + regName;
SystemRequest sysreq = new SystemRequest();
sysreq.setStatement(dropNSDDL.toCharArray());
SystemResult sysres = handle.systemRequest(sysreq);
sysres.waitForCompletion(handle, 60000,1000);
System.out.println("Region " + regName + " is dropped");
}
#Drop the table from a region
def drop_tab_region(handle):
statement = '''DROP TABLE stream_acct'''
request = TableRequest().set_statement(statement)
table_result = handle.do_table_request(request, 40000, 3000)
table_result.wait_for_completion(handle, 40000, 3000)
print('Dropped table: stream_acct')
#Drop the region
def drop_region(handle):
statement = '''DROP REGION LON'''
sysreq = SystemRequest().set_statement(statement)
sys_result = handle.system_request(sysreq)
sys_result.wait_for_completion(handle, 40000, 3000)
print('Region LON is dropped')
//drops a table from a region
func drpTabInRegion(client *nosqldb.Client, err error, tableName string)(){
stmt := fmt.Sprintf("DROP TABLE %s",tableName)
tableReq := &nosqldb.TableRequest{
Statement: stmt,
}
tableRes, err := client.DoTableRequest(tableReq)
if err != nil {
fmt.Printf("cannot initiate DROP TABLE request: %v\n", err)
return
}
_, err = tableRes.WaitForCompletion(client, 60*time.Second, time.Second)
if err != nil {
fmt.Printf("Error finishing DROP TABLE request: %v\n", err)
return
}
fmt.Println("Dropped table ", tableName)
return
}
//drop a region
func dropRegion(client *nosqldb.Client, err error)(){
stmt := fmt.Sprintf("DROP REGION LON")
sysReq := &nosqldb.SystemRequest{
Statement: stmt,
}
sysRes, err := client.DoSystemRequest(sysReq)
_, err = sysRes.WaitForCompletion(client, 60*time.Second, time.Second)
if err != nil {
fmt.Printf("Error finishing DROP REGION request: %v\n", err)
return
}
fmt.Println("Dropped REGION LON ")
return
}
//drop a table from a region
async function dropTabInRegion(handle) {
const dropDDL = `DROP TABLE ${TABLE_NAME}`;
let res = await handle.tableDDL(dropDDL);
console.log('Table dropped: ' + TABLE_NAME);
}
//drop a region
async function dropRegion(handle) {
const dropReg = `DROP REGION LON`;
let res = await handle.adminDDL(dropReg);
console.log('Region dropped: LON' );
}
private static async Task dropTabInRegion(NoSQLClient client){
var sql = $@"DROP TABLE {TableName}";
var tableResult = await client.ExecuteTableDDLAsync(sql);
// Wait for the operation completion
await tableResult.WaitForCompletionAsync();
Console.WriteLine(" Table {0} is dropped", tableResult.TableName);
}
private static async Task dropRegion(NoSQLClient client){
var sql = $@"DROP REGION LON";
var adminResult = await client.ExecuteAdminAsync(sql);
// Wait for the operation completion
await adminResult.WaitForCompletionAsync();
Console.WriteLine(" Dropped region LON");
}