UPDATE

UPDATE 命令用于更改指定表中现有文档的行式存储属性值。请注意,您无法更新全文字段或列式存储属性的内容。如果有此需求,请使用 REPLACE

RT、PQ 和普通表均支持属性更新。只要属性存储在行式存储中,所有属性类型都可以更新。

请注意,文档 ID 无法更新。

需要特别注意的是,更新属性会禁用其二级索引。如果保持二级索引的连续性至关重要,请考虑完全或部分替换文档。

有关 UPDATE 与部分 REPLACE 的更多信息,请阅读此处

‹›
  • SQL
  • JSON
  • PHP
  • Python
  • Python-asyncio
  • javascript
  • Java
  • C#
  • Rust
  • TypeScript
  • Go
📋
UPDATE products SET enabled=0 WHERE id=10;
‹›
Response
Query OK, 1 row affected (0.00 sec)

可以在单个语句中更新多个属性。例如:

‹›
  • SQL
  • JSON
  • PHP
  • Python
  • Python-asyncio
  • javascript
  • Java
  • C#
  • Rust
  • TypeScript
  • Go
📋
UPDATE products
SET price=100000000000,
    coeff=3465.23,
    tags1=(3,6,4),
    tags2=()
WHERE MATCH('phone') AND enabled=1;
‹›
Response
Query OK, 148 rows affected (0.0 sec)

当为 32 位属性分配超出范围的值时,这些值将被静默截断为其低 32 位。例如,如果您尝试用值 4294967297 更新 32 位无符号整数,实际存储的值将是 1,因为 4294967297(十六进制为 0x100000001)的低 32 位等于 1(十六进制为 0x00000001)。

UPDATE 可用于对数值数据类型或数值数据类型的数组执行部分 JSON 更新。只需确保不要用浮点值更新整数值,因为它会被四舍五入。

‹›
  • SQL
  • JSON
  • PHP
  • Python
  • Python-asyncio
  • javascript
  • Java
  • C#
  • Rust
  • TypeScript
  • Go
📋
insert into products (id, title, meta) values (1,'title','{"tags":[1,2,3]}');
update products set meta.tags[0]=100 where id=1;
‹›
Response
Query OK, 1 row affected (0.00 sec)
Query OK, 1 row affected (0.00 sec)

更新其他数据类型或更改 JSON 属性中的属性类型需要进行完整的 JSON 更新。

‹›
  • SQL
  • JSON
  • PHP
  • Python
  • Python-asyncio
  • javascript
  • Java
  • C#
  • Rust
  • TypeScript
  • Go
📋
insert into products values (1,'title','{"tags":[1,2,3]}');
update products set data='{"tags":["one","two","three"]}' where id=1;
‹›
Response
Query OK, 1 row affected (0.00 sec)
Query OK, 1 row affected (0.00 sec)

当使用复制时,表名应在 SQL 中以 cluster_name: 前缀,以便更新将传播到集群中的所有节点。对于通过 HTTP 的查询,应设置一个 cluster 属性。有关更多详细信息,请参阅 设置复制

{
  "cluster":"nodes4",
  "table":"test",
  "id":1,
  "doc":
  {
    "gid" : 100,
    "price" : 1000
  }
}
‹›
  • SQL
  • JSON
  • PHP
  • Python
  • Python-asyncio
  • javascript
  • Java
  • C#
  • Rust
  • TypeScript
  • Go
📋
update weekly:posts set enabled=0 where id=1;

通过 SQL 更新

以下是 SQL UPDATE 语句的语法:

UPDATE table SET col1 = newval1 [, ...] WHERE where_condition [OPTION opt_name = opt_value [, ...]] [FORCE|IGNORE INDEX(id)]

where_condition 的语法与 SELECT 语句相同。

多值属性值集必须作为逗号分隔的列表在括号中指定。要从多值属性中删除所有值,只需将其设置为 ()

‹›
  • SQL
  • JSON
  • PHP
  • Python
  • Python-asyncio
  • javascript
  • Java
  • C#
  • Rust
  • TypeScript
  • Go
📋
UPDATE products SET tags1=(3,6,4) WHERE id=1;
UPDATE products SET tags1=() WHERE id=1;
‹›
Response
Query OK, 1 row affected (0.00 sec)
Query OK, 1 row affected (0.00 sec)

OPTION 子句是 Manticore 特定的扩展,允许您控制每次更新的选项。语法如下:

OPTION <optionname>=<value> [ , ... ]

选项与 SELECT 语句相同。特别是对于 UPDATE 语句,您可以使用这些选项:

  • 'ignore_nonexistent_columns' - 如果设置为 1,则表示更新将静默忽略任何关于尝试更新当前表模式中不存在的列的警告。默认值为 0
  • 'strict' - 此选项用于部分 JSON 属性更新。默认情况下(strict=1),UPDATE 将在 UPDATE 查询尝试对非数值属性进行更新时导致错误。strict=0 时,如果多个属性被更新且某些属性不允许更新,则 UPDATE 将不会导致错误,而是仅对允许的属性进行更改(其余属性将被忽略)。如果 UPDATESET 变化中没有任何允许的更改,则即使 strict=0,命令也会导致错误。

查询优化器提示

在极少数情况下,Manticore 的内置查询分析器可能无法正确理解查询并确定是否应使用 ID 表。这可能导致类似 UPDATE ... WHERE id = 123 的查询性能不佳。 有关如何强制优化器使用 docid 索引的信息,请参阅 查询优化器提示

通过 HTTP JSON 更新

使用 HTTP JSON 协议的更新是通过 /update 端点执行的。语法类似于 /insert 端点,但这次 doc 属性是必需的。

服务器将返回一个 JSON 对象,说明操作是否成功。

‹›
  • JSON
JSON
📋
POST /update
{
  "table":"test",
  "id":1,
  "doc":
   {
     "gid" : 100,
     "price" : 1000
    }
}
‹›
Response
{
  "table": "test",
  "_id": 1,
  "result": "updated"
}

需要更新的文档的 ID 可以直接使用 id 属性设置,如上一个示例所示,或者可以通过查询更新文档,并将更新应用于匹配查询的所有文档:

‹›
  • JSON
JSON
📋
POST /update
{
  "table":"test",
  "doc":
  {
    "price" : 1000
  },
  "query":
  {
    "match": { "*": "apple" }
  }
}
‹›
Response
{
  "table":"products",
  "updated":1
}

查询语法与 /search 端点 相同。请注意,您不能同时指定 idquery

刷新属性

FLUSH ATTRIBUTES

The FLUSH ATTRIBUTES 命令确保所有活动表中的内存属性更新都被刷新到磁盘。它返回一个标识结果磁盘状态的标签,该状态代表自服务器启动以来实际执行的磁盘属性保存次数。

mysql> UPDATE testindex SET channel_id=1107025 WHERE id=1;
Query OK, 1 row affected (0.04 sec)
mysql> FLUSH ATTRIBUTES;
+------+
| tag  |
+------+
|    1 |
+------+
1 row in set (0.19 sec)

参见 attr_flush_period 设置。

批量更新

您可以使用 /bulk 端点在一个调用中执行多个更新操作。此端点仅适用于 Content-Type 设置为 application/x-ndjson 的数据。数据应格式化为新行分隔的 JSON(NDJSON)。这意味着每行应包含恰好一个 JSON 语句,并以新行 \n 结尾,可能还有 \r

‹›
  • JSON
JSON
📋
POST /bulk
{ "update" : { "table" : "products", "id" : 1, "doc": { "price" : 10 } } }
{ "update" : { "table" : "products", "id" : 2, "doc": { "price" : 20 } } }
‹›
Response
{
   "items":
   [
      {
         "update":
         {
            "table":"products",
            "_id":1,
            "result":"updated"
         }
      },
      {
         "update":
         {
            "table":"products",
            "_id":2,
            "result":"updated"
         }
      }
   ],
   "errors":false
}

/bulk 端点支持插入、替换和删除。每个语句以动作类型开始(在这种情况下,update)。以下是受支持的动作列表:

  • insert:插入文档。语法与 /insert 端点 相同。
  • createinsert 的同义词
  • replace:替换文档。语法与 /replace 相同。
  • indexreplace 的同义词
  • update:更新文档。语法与 /update 相同。
  • delete:删除文档。语法与 /delete 端点 相同。

还支持通过查询进行更新和通过查询进行删除。

‹›
  • JSON
  • PHP
  • Python
  • Python-asyncio
  • javascript
  • Java
  • C#
  • Rust
  • TypeScript
  • Go
📋
POST /bulk
{ "update" : { "table" : "products", "doc": { "coeff" : 1000 }, "query": { "range": { "price": { "gte": 1000 } } } } }
{ "update" : { "table" : "products", "doc": { "coeff" : 0 }, "query": { "range": { "price": { "lt": 1000 } } } } }
‹›
Response
{
  "items":
  [
    {
      "update":
      {
        "table":"products",
        "updated":1
      }
    },
    {
      "update":
      {
        "table":"products",
        "updated":3
      }
    }
  ],
  "errors":false
}

请记住,如果批量操作在导致错误的第一个查询处停止。

与更新相关的设置

attr_update_reserve

attr_update_reserve=size

attr_update_reserve 是一个针对每个表的设置,用于确定为二进制大对象属性更新保留的空间。此设置是可选的,默认值为 128k。

当二进制大对象属性(MVA、字符串、JSON)更新时,它们的长度可能会改变。如果更新后的字符串(或 MVA 或 JSON)比旧字符串短,则会覆盖 .spb 文件中的旧字符串。但是,如果更新后的字符串更长,则更新将写入 .spb 文件的末尾。此文件是内存映射的,这意味着调整其大小可能是一个相当慢的过程,具体取决于操作系统实现的内存映射文件。

为了避免频繁调整大小,可以使用此选项指定在 .spb 文件末尾保留的额外空间。

‹›
  • SQL
  • JSON
  • PHP
  • Python
  • Python-asyncio
  • javascript
  • Java
  • C#
  • Rust
  • TypeScript
  • Go
  • CONFIG
📋
create table products(title text, price float) attr_update_reserve = '1M'

attr_flush_period

attr_flush_period = 900 # persist updates to disk every 15 minutes

在更新属性时,更改首先被写入属性的内存副本。此设置允许设置将更新刷新到磁盘之间的间隔。默认值为 0,这禁用了周期性刷新,但刷新仍会在正常关闭时发生。

Last modified: August 28, 2025