更新数据
通过 HTTP RESTful API 对 MySQL 数据库进行更新操作。具体接口详情请参考 HTTP API/MySQL数据库
基础语法
PATCH https://your-envId.api.tcloudbasegateway.com/v1/rdb/rest/:table
Authorization: Bearer <access_token>
Content-Type: application/json
💡 提示:access_token 请参考 获取AccessToken
基础更新
# 更新单条数据
curl -X PATCH 'https://{{host}}/v1/rdb/rest/film?id=eq.1' \
-H 'Authorization: Bearer <access_token>' \
-H 'Content-Type: application/json' \
-d '{
"duration": 202
}'
💡 注意:默认情况下更新操作不返回数据,仅返回状态码和受影响行数
Response
content-range: */1,表示受影响行数,此时表示更新了 1 条数据preference-applied: return=minimal,表示执行写数据时,采用了return=minimal的返回策略(写操作默认行为,即不产生返回体)
请求返回示例
HTTP/1.1 204 No Content
Header:
content-range: */1
preference-applied: return=minimal
Body: (Empty)
更新并返回数据
# 更新数据并返回更新后的完整记录
curl -X PATCH 'https://{{host}}/v1/rdb/rest/film?select=*&id=in.(3,4,5)' \
-H 'Authorization: Bearer <access_token>' \
-H 'Content-Type: application/json' \
-H 'Prefer: return=representation' \
-d '{
"director": "Francis Ford Coppola"
}'
Request
- 请求中指定 Header
Prefer: return=representation,表示执行更新时,返回更新后的数据
💡 注意:更新后返回数据,实际上是更新+查询,因此会产生 两次 db 请求。两次请求在同一事务内,因此不会产生脏读,但如果查询失败会导致更新也一起回滚。
请求返回示例
HTTP/1.1 200 OK
Header:
content-length: 387
content-range: */3
content-type: application/json; charset=utf-8
preference-applied: return=representation
Body:
[
{
"director": "Francis Ford Coppola",
"duration": 175,
"id": 3,
"release_year": 1972,
"title": "The Godfather"
},
{
"director": "Francis Ford Coppola",
"duration": 202,
"id": 4,
"release_year": 1974,
"title": "The Godfather: Part II"
},
{
"director": "Francis Ford Coppola",
"duration": 194,
"id": 5,
"release_year": 1990,
"title": "The Godfather: Part III"
}
]
无条件更新限制
# 无条件更新会被拒绝
curl -X PATCH 'https://{{host}}/v1/rdb/rest/film' \
-H 'Authorization: Bearer <access_token>' \
-H 'Content-Type: application/json' \
-d '{
"duration": 202
}'
Response
- 无条件更新属于不安全的操作,当请求发生时,系统会做保护,拒绝此类请求
请求返回示例
HTTP/1.1 400 Bad Request
Header:
content-length: 113
content-type: application/json; charset=utf-8
Body:
{
"code": "BadApiRequest",
"details": "",
"hint": "",
"message": "UPDATE requires a WHERE clause"
}
复杂条件更新
# 更新时指定复杂条件+排序+分页
curl -X PATCH 'https://{{host}}/v1/rdb/rest/film?select=*&id=in.(3,4,5)&and=(duration.gte.150,duration.lt.200)&or=(director.eq.Christopher Nolan,director.eq.Frank Darabont)&limit=1&order=id.desc' \
-H 'Authorization: Bearer <access_token>' \
-H 'Content-Type: application/json' \
-H 'Prefer: return=representation' \
-d '{
"director": "Francis Ford Coppola"
}'
Request
id=in.(3,4,5): 更新 id 在 3、4、5中的记录and=(duration.gte.150,duration.lt.200): 且时长大于等于 150 分钟,且时长小于 200 分钟or=(director.eq.Christopher Nolan,director.eq.Frank Darabont): 或导演是 Christopher Nolan 或 Frank Darabontlimit=1: 最多更新 1 条记录order=id.desc: 按 id 降序排序后更新
请求返回示例
HTTP/1.1 200 OK
Header:
content-length: 142
content-range: */1
content-type: application/json; charset=utf-8
preference-applied: return=representation
Body:
[
{
"_openid": "1977683311217119233",
"director": "Francis Ford Coppola",
"duration": 194,
"id": 5,
"release_year": 1990,
"title": "The Godfather: Part III"
}
]
特殊场景
当执行更新操作且返回数据时,系统会根据主键来获取更新后的数据,但需要注意甄别以下场景:
单字段主键表
如果表的主键是单字段,那么在更新时,主键既作为更新条件又作为更新值时,更新会成功,但查询返回可能不符合预期:
# 将 id=1 的电影信息主键改为 2
curl -X PATCH 'https://{{host}}/v1/rdb/rest/film?select=title,release_year,duration&id=eq.1' \
-H 'Authorization: Bearer <access_token>' \
-H 'Content-Type: application/json' \
-H 'Prefer: return=representation' \
-d '{
"id": 2
}'
此时可以正常更新数据,返回头的 Content-Range 会表明受影响行数 1,但是由于 id 既作为主键又作为更新值,所以查询结果会为空
联合主键表
同单字段主键一样,如果联合主键其中任意一个字段既作为条件又作为更新值时,更新会成功,但查询返回可能不符合预期:
# 表 user_activities 的联合主键为 (activity_date, activity_type)
# 将 user_activities 表中 activity_type 为 login 的记录的 activity_type 更新为 logout
curl -X PATCH 'https://{{host}}/v1/rdb/rest/user_activities?activity_type=eq.login' \
-H 'Authorization: Bearer <access_token>' \
-H 'Content-Type: application/json' \
-H 'Prefer: return=representation' \
-d '{
"activity_type": "logout"
}'
此时可以正常更新数据,返回头的 Content-Range 会表明受影响行数 1,但是由于 activity_type 是联合主键的一部分,且作为更新值,所以查询结果会为空
无主键表
如果表没有主键,那么在更新时,不能指定请求头 Prefer: return=representation,不支持无主键表更新且返回数据,会报错提示:
table <table_name> has no primary key, cannot use update-with-return, suggest remove query
当移除 Prefer: return=representation 后,无主键表可以正常更新