修改資料的操作是 Web API 的核心部分。 除了簡單的更新與刪除操作外,你還可以對單一資料表欄位(實體屬性)執行操作,並組合 upsert 請求,根據資料是否存在來更新或插入資料。
基本更新
更新作業使用 HTTP PATCH 動詞。 將包含您要更新之屬性的 JSON 物件傳遞至代表記錄的 URI。 若更新成功,回應會回傳狀態為 204 No Content。
If-Match: *標頭可確保您不會因意外執行更新插入作業而建立新記錄。 欲了解更多資訊,請參閱 「防止在 upsert 中創建」。
這很重要
在更新實體時,只需在要求本文中包含您要變更的屬性。 如果你透過包含先前取得的該實體的所有屬性來更新一個實體,即使值相同,操作也會更新每個屬性。 此更新可能引發系統事件,觸發業務邏輯預期值已變更。 這可能導致屬性在審計資料中看起來像是更新了,實際上並沒有改變。
更新statecode屬性時,務必設定所需的statuscode。
statecode和 statuscode 的數值彼此依賴。 對於給定 statecode 的值,可以有多個有效 statuscode 值。 然而,每 statecode 欄都設定了一個 DefaultStatus 值。 當你更新statecode但未指定statuscode時,系統會設定預設狀態值。 另外,如果你在資料表和 statuscode 欄位啟用稽核,欄位的變更值 statuscode 不會被記錄在稽核資料中,除非你在更新操作中指定。
備註
屬性的定義包括一個 RequiredLevel 屬性。 當這個屬性被設定為 SystemRequired時,你無法將這些屬性設為 null 值。 更多資訊請參見 屬性需求等級。
此範例更新值為 000000000-0000-0000-0000-000000000001 的現有帳戶記錄 accountid 。
要求:
PATCH [Organization URI]/api/data/v9.2/accounts(00000000-0000-0000-0000-000000000001) HTTP/1.1
Content-Type: application/json
OData-MaxVersion: 4.0
OData-Version: 4.0
If-Match: *
{
"name": "Updated Sample Account ",
"creditonhold": true,
"address1_latitude": 47.639583,
"description": "This is the updated description of the sample account",
"revenue": 6000000,
"accountcategorycode": 2
}
回應:
HTTP/1.1 204 No Content
OData-Version: 4.0
備註
關於在更新時關聯與分離實體的資訊,請參見 使用單一值導航屬性。
使用傳回的資料進行更新
要從你正在更新的實體中取得資料,請撰寫 PATCH 請求,使其狀態碼為 200(OK)時,從更新後的紀錄中回傳資料。 要取得此結果,請使用 Prefer: return=representation request 標頭。
要控制回傳哪些屬性,請將查詢選項附加 $select 到實體集合的 URL 後面。
$expand查詢選項會被忽略,即使使用它。
此範例會更新帳戶實體,並在回應中傳回要求的資料。
要求:
PATCH [Organization URI]/api/data/v9.2/accounts(00000000-0000-0000-0000-000000000001)?$select=name,creditonhold,address1_latitude,description,revenue,accountcategorycode,createdon HTTP/1.1
OData-MaxVersion: 4.0
OData-Version: 4.0
Accept: application/json
Content-Type: application/json; charset=utf-8
Prefer: return=representation
If-Match: *
{"name":"Updated Sample Account"}
回應:
HTTP/1.1 200 OK
Content-Type: application/json; odata.metadata=minimal
Preference-Applied: return=representation
OData-Version: 4.0
{
"@odata.context": "[Organization URI]/api/data/v9.2/$metadata#accounts/$entity",
"@odata.etag": "W/\"536537\"",
"accountid": "00000000-0000-0000-0000-000000000001",
"accountcategorycode": 1,
"description": "This is the description of the sample account",
"address1_latitude": 47.63958,
"creditonhold": false,
"name": "Updated Sample Account",
"createdon": "2016-09-28T23:14:00Z",
"revenue": 5000000.0000,
"_transactioncurrencyid_value": "048dddaa-6f7f-e611-80d3-00155db5e0b6"
}
在單一請求中更新多筆記錄
在單一要求中更新相同類型的多筆記錄的最快方式是使用 UpdateMultiple 動作。 並非所有標準資料表都支援此動作,但所有彈性資料表都支援。
其他資訊:
更新單一屬性值
要更新單一屬性值,請使用 PUT 請求並將物件名稱加入該實體的 Uri 中。
以下範例將 name 屬性更新為現有 account 列的 accountid 值 00000000-0000-0000-0000-000000000001。
要求:
PUT [Organization URI]/api/data/v9.2/accounts(00000000-0000-0000-0000-000000000001)/name HTTP/1.1
Content-Type: application/json
OData-MaxVersion: 4.0
OData-Version: 4.0
{"value": "Updated Sample Account Name"}
回應:
HTTP/1.1 204 No Content
OData-Version: 4.0
刪除單一屬性值
要刪除單一屬性的值,請對實體的 URI 發出請求,並將屬性名稱附加到 URI 後面DELETE。
以下範例刪除具有 accountid 值為 00000000-0000-0000-0000-000000000001 的帳戶實體屬性的 description 值。
要求:
DELETE [Organization URI]/api/data/v9.2/accounts(00000000-0000-0000-0000-000000000001)/description HTTP/1.1
Content-Type: application/json
OData-MaxVersion: 4.0
OData-Version: 4.0
回應:
HTTP/1.1 204 No Content
OData-Version: 4.0
備註
你無法用這種方法來讓單一值的導航屬性分離兩個實體。 另一種方法請參見「 使用單一值導航屬性來解除關聯」。
Upsert 資料表列
Upsert 作業類似於更新。 它使用 PATCH 請求並使用 URI 來引用特定記錄。 不同之處在於,如果記錄不存在,就會被建立。 如果已經存在,則會更新。
Upsert 在同步外部系統資料時非常有用。 外部系統可能沒有參考 Dataverse 資料表的主鍵,因此你可以使用外部系統的值,為 Dataverse 資料表設定替代鍵,這些值能在兩個系統中唯一識別該紀錄。 其他資訊: 定義參考資料列的替代索引鍵
您可以在 $metadata 服務文件中的實體型別註解中查看資料表所定義的替代金鑰。 其他資訊: 替代金鑰。
在下列範例中,有一個名為 sample_thing 的表格,其替代索引鍵參考了兩個資料行:sample_key1 和 sample_key2,這兩個資料行都定義為儲存整數值。
要求:
PATCH [Organization URI]/api/data/v9.2/sample_things(sample_key1=1,sample_key2=1) HTTP/1.1
Accept: application/json
OData-MaxVersion: 4.0
OData-Version: 4.0
If-None-Match: null
Content-Type: application/json
{
"sample_name": "1:1"
}
無論是建立還是更新操作,你都會得到相同的回應。 請注意回應 OData-EntityId 標頭如何使用索引鍵值,而不是記錄的 GUID 主索引鍵識別碼。
回應:
HTTP/1.1 204 No Content
OData-Version: 4.0
OData-EntityId: [Organization URI]/api/data/v9.2/sample_things(sample_key1=1,sample_key2=1)
因為回應相同,您無法確定該作業是否表示Create或Update作業。
如果需要知道,可以使用 Prefer: return=representation 請求頭。 使用此標頭時,當記錄建立時會收到回應,更新記錄時也會收到201 Created200 OK回應。 此選項會新增作業 Retrieve ,這會影響效能。 如果您使用 Prefer: return=representation 請求標頭,請確定您 $select 包含最少的數據量,最好只包含主索引鍵欄。 其他資訊: 使用傳回的資料進行更新 和 使用傳回的資料建立。
使用替代鍵時,請不要在請求文中包含替代鍵值。
- 當 upsert 為
Update時,會忽略這些替代金鑰值。 使用替代索引鍵值來識別記錄時,您無法更新它們。 - 當 upsert 為
Create時,如果本文中未包含金鑰值,則會使用 URL 中的金鑰值來建立記錄。 因此,無需將它們包含在請求內文中。
其他資訊: 使用 Upsert 建立或更新記錄
備註
通常在建立新紀錄時,你會讓系統為主鍵指派一個 GUID 值。 這種做法最佳,因為系統會產生針對索引優化的鍵,這種選擇能提升效能。 但是,如果您需要建立具有特定主索引鍵值的記錄,例如當外部系統產生索引鍵 GUID 值時,作業 upsert 會提供執行此動作的方法。
防止使用 upsert 建立或更新
有時候,你會想執行一個 upsert 但阻止其中一個可能的操作:建立或更新。 你可以透過使用 If-Match or If-None-Match 標頭來避免這些操作。 如需更多詳細資訊,請參閱限制 upsert 作業。
基本刪除
刪除作業很簡單。 使用 DELETE 動詞搭配欲刪除的實體 URI。 此範例訊息刪除一個主鍵 accountid 值為 00000000-0000-0000-0000-000000000001的帳戶實體。
要求:
DELETE [Organization URI]/api/data/v9.2/accounts(00000000-0000-0000-0000-000000000001) HTTP/1.1
Content-Type: application/json
OData-MaxVersion: 4.0
OData-Version: 4.0
回應:
如果實體存在,您會收到狀態為 204 的正常回應,以指出刪除成功。 如果找不到實體,您會收到狀態為 404 的回應。
HTTP/1.1 204 No Content
OData-Version: 4.0
檢查重複記錄
如需如何在更新作業期間檢查重複記錄的詳細資訊,請參閱 使用 Web API 在更新作業期間偵測重複記錄。
刪除單一要求中的多筆記錄
若要在單一請求中刪除多個相同類型的記錄,請使用該 DeleteMultiple 動作。 標準表格不支援這個 DeleteMultiple 動作,但所有彈性表格都有。
備註
對於標準資料表,請使用 BulkDelete 動作。 此動作可實現非同步刪除與查詢相符的紀錄。 欲了解更多資訊,請參閱 「大量刪除資料」。
其他資訊:
更新和刪除儲存分割區中的文件
如果你要更新或刪除儲存在分割區中的彈性資料表資料,存取資料時請指定分割區鍵。
其他資訊: 選擇 PartitionId 值
另請參閱
Web API 基本作業範例 (C#)
Web API 基本作業範例 (用戶端 JavaScript)
使用 Web API 執行作業
撰寫 Http 請求並處理錯誤
使用入口網站 API 查詢資料
使用 Web API 建立資料表資料列
使用 Web API 擷取資料表資料列
使用 Web API 關聯和取消關聯表格列
使用 Web API 函式
使用 Web API 動作
使用 Web API 執行批次作業
使用 Web API 模擬其他使用者
使用 Web API 執行條件式作業