MR_COUNTER列を含む行の更新

標準の算術計算を使用して値を増分または減分することで、複数リージョン表のMR_COUNTER列を更新できます。MR_COUNTER列を含む表の作成については、「MR_COUNTERデータ型を使用した表の作成」を参照してください

例1: MR_COUNTER列の値の増分。

簡単な例として、ユーザーがソーシャル・メディアWebサイトで取得する「いいね」を増分します。
CREATE Table myTable( name STRING,
                      count INTEGER AS MR_COUNTER,
                      PRIMARY KEY(name)) IN REGIONS DEN,LON;
INSERT INTO myTable(name) VALUES ("Chris');
UPDATE myTable SET count = count + 10 WHERE name = "Chris";

例2: MR_COUNTER列の値の減分。

次の例では、MR_COUNTERの値を小さくします。
CREATE Table myTable( name STRING,
                      count INTEGER AS MR_COUNTER,
                      PRIMARY KEY(name)) IN REGIONS DEN,LON;
INSERT INTO myTable VALUES ("Chris',10);
UPDATE myTable SET count = count - 4  WHERE name = "Chris";

ノート:

次のシナリオでは、MR_COUNTERSにUPDATE句を使用すると、エラーが返されます。
  • 表のMR_COUNTERに値を明示的に指定するSET句またはPUT句。
  • 表からMR_COUNTER列を削除するREMOVE句。

表からMR_COUNTER列を削除するには、ALTER文を使用できます。詳細は、「MR_COUNTER列の追加または削除」を参照してください。

JSON MR_COUNTER値の更新:

複数リージョン表内のJSON MR_COUNTER列を更新できます(MR_COUNTER列と同じ方法)。

例: JSON MR_COUNTER列の値の増分: 値を増分することでJSON MR_COUNTER列を更新できます。
UPDATE demoJSONMR a SET a.jsonWithCounter.counter = a.jsonWithCounter.counter + 1 
WHERE name = "Anna";
値の減分によってJSON MR_COUNTER列を更新することもできます。
UPDATE demoJSONMR a SET a.jsonWithCounter.counter = a.jsonWithCounter.counter - 1 
WHERE name = "Anna";

両方のリージョン内のカウンタ値の更新とマージの実行:

MR_COUNTERフィールドがリモートJSONフィールドとローカルJSONフィールドの両方に存在する場合、それらはMR_COUNTERデータ型としてマージされます。リモート・リージョン内とローカル・リージョン内のMR_COUNTERフィールドは個別に更新できます。ユーザーによる操作は必要なく、システムによって、これらの同時変更時に自動的にマージが実行されます。

たとえば、demoJSONMRという表が、下記と同じ定義で、FRAおよびLONというリージョン内に作成されているとします。
CREATE TABLE demoJSONMR(name STRING,
  jsonWithCounter JSON(counter as INTEGER MR_COUNTER, 
                       person.count as LONG MR_COUNTER),
  PRIMARY KEY(name)) IN REGIONS FRA,LON;
ステップ1: リージョンFRA内のdemoJSONMR表に1行挿入します。
INSERT INTO demoJSONMR VALUES (
      Anna,
        {
            "id" : 1,
            "counter" : NULL,
            "person" : {
                "age" : 10,
                "number" : 100
            }
        }
    }
ステップ2: 上で挿入した行を更新し、JSON MR_COUNTERフィールドcounterを増分します。
UPDATE demoJSONMR a SET a.jsonWithCounter.counter = a.jsonWithCounter.counter + 1
WHERE name = "Anna"
ステップ3: リモート・リージョンLONで、主キー(Anna)は同じだが他のフィールドの値は異なる表に、1行挿入します。
INSERT INTO exampleTable VALUES (
      Anna,
        {
            "id" : 2,
            "counter" : NULL,
            "person" : {
                "age" : 10,
                "number" : 101
            }
        }
    }
ステップ4: リモート・リージョンLONで、そのレコードを更新し、JSON MR_COUNTERフィールドcounterを増分します。
UPDATE demoJSONMR a SET a.jsonWithCounter.counter = a.jsonWithCounter.counter + 1 
WHERE name = "Anna";
ステップ5: 上の文で、リモート行が更新されます。この更新は、次に示すように、ローカル行およびフィールドcounterとマージされます。
SELECT * FROM demoJSONMR WHERE name = "Anna";
{"name":"Anna",
"jsonWithCounter":{"counter":2,"id":2,"person":
                     {"age":10,"count":0,"number":101}}
}  

MR_COUNTERのリモートJSONおよびローカルJSONの定義が一致しない場合、一致していないスキーマに対してはINSERT操作またはUPDATE操作が実行されません。これらの行は、矛盾した行としてログに記録されます。

JSONコレクション表のMR_COUNTER値の更新:

MR_COUNTERを使用したショッピング・アプリケーション用に作成されたJSONコレクション表について考えてみます。表のmycounterフィールドは、表へのデータの挿入時に値が0に設定されるMR_COUNTERです。ショッピング・アプリケーション表の行の例を次に示します。

{"contactPhone":"1817113382","address":{"city":"Houston","number":401,"state":"TX","street":"Tex Ave","zip":95085},"cart":[{"item":"handbag","priceperunit":350,"quantity":1},{"item":"Lego","priceperunit":5500,"quantity":1}],"firstName":"Adam","lastName":"Smith","mycounter":0}

MR_COUNTER値を更新するには、次の問合せに示すように、SET句にMR_COUNTERの名前を指定する必要があります。

UPDATE storeAcctMR s SET s.mycounter = s.mycounter + 5 WHERE s.contactPhone="1817113382"

この例では、連絡先電話番号が"1817113382"の買物客のMR_COUNTERの値を5だけ増やしています。この買物客のレコードをフェッチすると、次の出力が表示されます:

{"contactPhone":"1817113382","address":{"city":"Houston","number":401,"state":"TX","street":"Tex Ave","zip":95085},"cart":[{"item":"handbag","priceperunit":350,"quantity":1},{"item":"Lego","priceperunit":5500,"quantity":1}],"firstName":"Adam","lastName":"Smith","mycounter":5}