例: 行の更新

Peopleという表があり、それに2つの列(整数のid列とJSON型のinfo列)のみが含まれているとします。また、次の行を更新するとします。
CREATE TABLE People (
    id INTEGER,
    info JSON,
PRIMARY KEY(id))
INSERT INTO People VALUES (
    0,
    {
        "firstName":"John",
        "lastName":"Doe",
        "profession":"software engineer",
        "income":200000,
        "address": {
            "city" : "San Fransisco",
            "state" : "CA",
            "phones" : [ 
                { "areacode":415, "number":2840060, "kind":"office" },
                { "areacode":650, "number":3789021, "kind":"mobile" },
                { "areacode":415, "number":6096010, "kind":"home" }
            ]
        },
        "children": {
            "Anna" : { 
                "age" : 10,
                "school" : "school_1",
                "friends" : ["Anna", "John", "Maria"]
            },
            "Ron" : { "age" : 2 },
            "Mary" : { 
                "age" : 7,
                "school" : "school_3",
                "friends" : ["Anna", "Mark"] 
            }
        }
    }
)

例7-31 UPDATE文を使用して表内の様々なフィールドを更新する

次のupdate文は、前述の行の様々なフィールドを更新します。

UPDATE People p
    SET p.info.profession = "surfing instructor",
    SET p.info.address.city = "Santa Cruz",
    SET p.info.income = p.info.income / 10,
    SET p.info.children.values().age = $ + 1,
    ADD p.info.address.phones
      0 { "areacode":831, "number":5294368, "kind":"mobile" },
    REMOVE p.info.address.phones [$element.kind = "office"],
    PUT p.info.children.Ron { "friends" : ["Julie"] },
    ADD p.info.children.values().friends seq_concat("Ada", "Aris")
WHERE id = 0
RETURNING *

更新後、行は次のようになります。

{
    "id":0,
    "info":{
        "firstName":"John",
        "lastName":"Doe",
        "profession":"surfing instructor",
        "income":20000,
        "address":{
            "city":"Santa Cruz",
            "phones":[
                {"areacode":831,"kind":"mobile","number":5294368},
                {"areacode":650,"kind":"mobile","number":3789021},
                {"areacode":415,"kind":"home","number":6096010}
            ],
            "state":"CA"
        },
        "children":{
            "Anna":{
                "age":11,
                "friends":["Anna","John","Maria","Ada","Aris"],
                "school":"school_1"
            },
            "Ron":{
                "age":3,
                "friends":["Julie","Ada","Aris"]
            },
            "Mary":{
                "age":8,
                "friends":["Anna","Mark","Ada","Aris"],
                "school":"school_3"
            }
        }
    }
}

最初の2つのSET句によって、John Doeの職業と都市が変更されます。3番目のSETは、収入を10分の1に削減します。4番目のSETは、子の年齢を1増やします。ここで$変数を使用していることに注目してください。式p.info.children.values().ageは3つの年齢を返します。SETはこれらの年齢を繰り返し処理し、$変数を各年齢にバインドし、年齢ごとに式$+ 1を計算し、新しい値で年齢を更新します。なお、収入の更新に$変数を使用することもできます(set p.info.income = $ / 10)。この式では、"="の右側で、p.info.incomeパスの再評価が省かれています。

ADD句は、phones配列内の位置0に新しい電話を追加します。REMOVEは、すべてのオフィスの電話(この例では1つのみ)を削除します。PUT句はRonの友人を追加します。この句では、式p.info.children.Ronは、Ronの子に関連付けられている値を返します。この値はマップ(jsonオブジェクト{ "age" : 3 })であり、更新のターゲットになります。PUTの2番目の式({ "friends" : ["Julie"] })は、新しいマップを作成して返します。このマップのフィールドがターゲット・マップに追加されます。最後に、最後のADD句は、同じ2人の新しい友人をそれぞれの子に追加します。「seq_concat関数」関数を参照してください。

この例の更新問合せは、JSON型ではなく、info列に次のRECORD型がある場合にまったく同じであることに注意してください。

RECORD(
    firstName STRING,
    lastName STRING,
    profession STRING,
    income INTEGER,
    address RECORD(
        city STRING,
        state STRING,
        phones ARRAY(
            RECORD(
                areacode INTEGER,
                number INTEGER,
                kind STRING
            )
        )
    ),
    children MAP(
        RECORD(
            age INTEGER,
            school STRING,
            friends ARRAY(STRING)
        )
    )
)

例: 複数の行の更新

EmployeeInfoという名前の表を作成し、整数のempID列(主キー)、文字列のdepartment列(シャード・キー)、文字列のfullName列およびJSON型のinfo列を設定します。

CREATE TABLE EmployeeInfo (
    empID INTEGER,
    department STRING,
    fullName STRING,
    info JSON,
    PRIMARY KEY(SHARD(department), empID))

その後、次の行を追加します:

INSERT INTO EmployeeInfo VALUES (101, "HR", "Liam Phillips", {"salary":100000,"address":{"city":"Toronto","country":"Canada"}})
 
INSERT INTO EmployeeInfo VALUES (102, "HR", "Emma Johnson", {"salary":105000,"address":{"city":"Melbourne","country":"Australia"}})
 
INSERT INTO EmployeeInfo VALUES (103, "IT", "Carlos Martinez", {"salary":110000,"address":{"city":"Barcelona","country":"Spain"}})   
 
INSERT INTO EmployeeInfo VALUES (104, "Finance", "Sophia Becker", {"salary":130000,"address":{"city":"Munich","country":"Germany"}})
 
INSERT INTO EmployeeInfo VALUES (105, "IT", "Ethan Dalmini", {"salary":250000,"address":{"city":"Cape Town","country":"South Africa"}})
 
INSERT INTO EmployeeInfo VALUES (106, "HR", "James Peterson", {"salary":100500,"address":{"city":"Istanbul","country":"Turkey"}})
 
INSERT INTO EmployeeInfo VALUES (107, "Finance", "John Doe", {"salary":250000,"address":{"city":"Seoul","country":"South Korea"}})

例7-32 UPDATE文を使用した表の複数の行の更新

次の文は、指定されたシャード・キーに関連付けられた行の指定されたフィールドを更新します。

UPDATE EmployeeInfo emp
    SET emp.info.address.city="Oslo",
    SET emp.info.address.country="Norway",
    SET emp.info.salary = emp.info.salary + 5000
 where department="HR"

説明: 前述の問合せでは、SET句によって、info.address.cityフィールドが「Oslo」、info.address.countryフィールドが「Norway」に更新され、シャード・キーとして指定されたdepartment列が「HR」と等しいすべての行のinfo.salaryフィールドに5000が加算されます。このUPDATE文にはシャード・キーのみが記述されているため、データベースは更新した行数のみを返します。

出力:
+----------------+
 | NumRowsUpdated |
 +----------------+
 |              3 |
 +----------------+

ここで、SELECT問合せを実行して、更新された行を確認します。info.address.cityおよびinfo.address.countryフィールドがそれぞれ「Oslo」および「Norway」に更新されたことを確認し、HR部門で働くすべての従業員のinfo.salaryフィールドに5000が加算されたことを確認します。

select * from EmployeeInfo
出力:
+-------+------------+-----------------+----------------------------+
 | empID | department |    fullName     |            info            |
 +-------+------------+-----------------+----------------------------+
 |   103 | IT         | Carlos Martinez | address                    |
 |       |            |                 |     city    | Barcelona    |
 |       |            |                 |     country | Spain        |
 |       |            |                 | salary      | 110000       |
 +-------+------------+-----------------+----------------------------+
 |   105 | IT         | Ethan Dalmini   | address                    |
 |       |            |                 |     city    | Cape Town    |
 |       |            |                 |     country | South Africa |
 |       |            |                 | salary      | 250000       |
 +-------+------------+-----------------+----------------------------+
 |   101 | HR         | Liam Phillips   | address                    |
 |       |            |                 |     city    | Oslo         |
 |       |            |                 |     country | Norway       |
 |       |            |                 | salary      | 105000       |
 +-------+------------+-----------------+----------------------------+
 |   102 | HR         | Emma Johnson    | address                    |
 |       |            |                 |     city    | Oslo         |
 |       |            |                 |     country | Norway       |
 |       |            |                 | salary      | 110000       |
 +-------+------------+-----------------+----------------------------+
 |   106 | HR         | James Peterson  | address                    |
 |       |            |                 |     city    | Oslo         |
 |       |            |                 |     country | Norway       |
 |       |            |                 | salary      | 105500       |
 +-------+------------+-----------------+----------------------------+
 |   104 | Finance    | Sophia Becker   | address                    |
 |       |            |                 |     city    | Munich       |
 |       |            |                 |     country | Germany      |
 |       |            |                 | salary      | 130000       |
 +-------+------------+-----------------+----------------------------+
 |   107 | Finance    | John Doe        | address                    |
 |       |            |                 |     city    | Seoul        |
 |       |            |                 |     country | South Korea  |
 |       |            |                 | salary      | 250000       |
 +-------+------------+-----------------+----------------------------+
 
7 rows returned