UPDATE

Команда UPDATE изменяет построчно значения атрибутов существующих документов в указанной таблице на новые значения. Обратите внимание, что нельзя обновлять содержимое поля полнотекстового поиска или колонного атрибута. Если возникает такая необходимость, используйте REPLACE.

Обновление атрибутов поддерживается для RT, PQ и обычных таблиц. Все типы атрибутов могут быть обновлены, если они хранятся в построчном хранилище.

Обратите внимание, что идентификатор документа обновить нельзя.

Важно понимать, что обновление атрибута отключает его вторичный индекс. Если критично поддерживать непрерывность вторичного индекса, рассмотрите возможность полного или частичного замещения документа.

Подробнее о 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 бит без предупреждения. Например, если попытаться обновить 32-битное беззнаковое целое значением 4294967297, фактически будет сохранено значение 1, так как младшие 32 бита числа 4294967297 (0x100000001 в шестнадцатеричном виде) равны 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)

When using replication, the table name should be prepended with cluster_name: (in SQL) so that updates will be propagated to all nodes in the cluster. For queries via HTTP, you should set a cluster property. See setting up replication for more information.

{
  "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;

Updates via SQL

Here is the syntax for the SQL UPDATE statement:

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

where_condition has the same syntax as in the SELECT statement.

Multi-value attribute value sets must be specified as comma-separated lists in parentheses. To remove all values from a multi-value attribute, just assign () to it.

‹›
  • 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 clause is a Manticore-specific extension that lets you control a number of per-update options. The syntax is:

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

The options are the same as for the SELECT statement. Specifically for the UPDATE statement, you can use these options:

  • 'ignore_nonexistent_columns' - If set to 1, it indicates that the update will silently ignore any warnings about trying to update a column which does not exist in the current table schema. The default value is 0.
  • 'strict' - This option is used in partial JSON attribute updates. By default (strict=1), UPDATE will result in an error if the UPDATE query tries to perform an update on non-numeric properties. With strict=0, if multiple properties are updated and some are not allowed, the UPDATE will not result in an error and will perform the changes only on allowed properties (with the rest being ignored). If none of the SET changes of the UPDATE re permitted, the command will result in an error even with strict=0.

Query optimizer hints

In rare cases, Manticore's built-in query analyzer may be incorrect in understanding a query and determining whether a table by ID should be used. This can result in poor performance for queries like UPDATE ... WHERE id = 123. For information on how to force the optimizer to use a docid index, see Query optimizer hints.

Updates via HTTP JSON

Updates using HTTP JSON protocol are performed via the /update endpoint. The syntax is similar to the /insert endpoint, but this time the doc property is mandatory.

The server will respond with a JSON object stating if the operation was successful or not.

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

The ID of the document that needs to be updated can be set directly using the id property, as shown in the previous example, or you can update documents by query and apply the update to all the documents that match the query:

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

Синтаксис запроса такой же, как в /search endpoint. Обратите внимание, что нельзя указывать id и query одновременно.

Сброс атрибутов

FLUSH ATTRIBUTES

Команда 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.

Массовые обновления

Вы можете выполнить несколько операций обновления в одном вызове, используя endpoint /bulk. Этот endpoint работает только с данными, у которых 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
}

Endpoint /bulk поддерживает вставки, замены и удаления. Каждое выражение начинается с типа действия (в данном случае update). Вот список поддерживаемых действий:

  • insert: Вставляет документ. Синтаксис такой же, как в /insert endpoint.
  • create: синоним для insert
  • replace: Заменяет документ. Синтаксис такой же, как в /replace.
  • index: синоним для replace
  • update: Обновляет документ. Синтаксис такой же, как в /update.
  • delete: Удаляет документ. Синтаксис такой же, как в /delete endpoint.

Также поддерживаются обновления по запросу и удаления по запросу.

‹›
  • 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.

Когда блоб-атрибуты (MVAs, строки, 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