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)

При использовании репликации имя таблицы должно быть предварено cluster_name: (в SQL), чтобы обновления распространялись на все узлы в кластере. Для запросов через 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 не приведет к ошибке и выполнит изменения только для разрешенных свойств (остальные будут проигнорированы). Если ни одно из изменений SET в UPDATE не разрешено, команда приведет к ошибке даже при 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. Обратите внимание, что нельзя указывать одновременно 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.

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

Вы можете выполнить несколько операций обновления за один вызов, используя конечную точку /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.
  • 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 — это настройка для каждой таблицы, которая определяет пространство, зарезервированное для обновлений атрибутов-больших объектов (blob). Эта настройка является необязательной, значение по умолчанию — 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