修改資料的操作是 Web API 的核心部分。 除了簡單的更新和刪除操作之外,您還可以對單個表列(實體屬性)執行操作,並撰寫更新 插入 請求,這些請求將根據資料是否存在而更新或插入資料。
基本更新
更新作業使用 HTTP PATCH 動詞。 將包含您要更新之屬性的 JSON 物件傳遞至代表記錄的 URI。 如果更新成功,則會傳回狀態為 的 204 No Content 回應。
If-Match: *標頭可確保您不會因意外執行更新插入作業而建立新記錄。 更多資訊:防止在 upsert 中建立記錄。
這很重要
在更新實體時,只需在要求本文中包含您要變更的屬性。 如果只是將先前擷取的實體屬性重新提交,即使數值相同,系統也會視為更新每個屬性。 這可能觸發預期值變更的商務邏輯事件。 這可能會導致屬性在稽核資料中似乎已更新,而實際上它們實際上並未變更。
當您更新 statecode 屬性時,請務必設定所需的 statuscode。
statecode 並 statuscode 具有依賴值。 對某個statecode值可以有多個有效statuscode值,但每個statecode資料行都設定了單一DefaultStatus值。 當您更新statecode而未指定statuscode時,系統將設定預設狀態值。 此外,在表格及 statuscode 直欄上啟用審核時,除非在更新作業中指定,否則不會在審核資料中擷取直欄的 statuscode 變更值。
備註
屬性的定義包括一個 RequiredLevel 屬性。 當此值設定為 SystemRequired時,您無法將這些屬性設為空值。 其他資訊: 屬性需求層級
此範例更新值為 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 (確定)。 若要取得此結果,您必須使用 Prefer: return=representation 要求標頭。
若要控制傳回哪些屬性,請將 $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 動作。 在撰寫本文的時候,正進行 UpdateMultiple 動作。 並非所有標準資料表都支援此動作,但所有彈性資料表都支援。
其他資訊:
更新單一屬性值
當您只想更新單一屬性值時,請使用 PUT 要求,並將屬性名稱附加在實體的 URI 後。
下列範例會將現有account資料列的name屬性更新為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
刪除單一屬性值
若要刪除單一屬性的值,請使用 DELETE 要求將屬性名稱追加到實體的 URI。
下列範例會刪除帳戶實體屬性 description 的值,而該屬性 accountid 的值為 00000000-0000-0000-0000-000000000001。
要求:
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 Created回應,而更新記錄時會收到200 OK回應。 此選項會新增作業 Retrieve ,這會影響效能。 如果您使用 Prefer: return=representation 請求標頭,請確定您 $select 包含最少的數據量,最好只包含主索引鍵欄。 其他資訊: 使用傳回的資料進行更新 和 使用傳回的資料建立。
使用替代索引鍵時,您不應該在請求內文中包含替代索引鍵值。
- 當 upsert 為
Update時,會忽略這些替代金鑰值。 使用替代索引鍵值來識別記錄時,您無法更新它們。 - 當 upsert 為
Create時,如果本文中未包含金鑰值,則會使用 URL 中的金鑰值來建立記錄。 因此,無需將它們包含在請求內文中。
其他資訊: 使用 Upsert 建立或更新記錄
備註
通常,建立新記錄時,您會讓系統為主索引鍵指派 GUID 值。 這是最佳作法,因為系統會產生針對索引最佳化的索引鍵,這會改善效能。 但是,如果您需要建立具有特定主索引鍵值的記錄,例如當外部系統產生索引鍵 GUID 值時,作業 upsert 會提供執行此動作的方法。
防止使用 upsert 建立或更新
有時候,您可能想執行 upsert,但希望阻止其中一個可能的操作:建立或更新。 您可以使用If-Match標頭或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 執行條件式作業