space_object:update()
-
object
space_object
-
space_object:
update
(key, {{operator, field_no, value}, ...}) Update a tuple.
The
update
function supports operations on fields — assignment, arithmetic (if the field is numeric), cutting and pasting fragments of a field, deleting or inserting a field. Multiple operations can be combined in a single update request, and in this case they are performed atomically and sequentially. Each operation requires specification of a field number. When multiple operations are present, the field number for each operation is assumed to be relative to the most recent state of the tuple, that is, as if all previous operations in a multi-operation update have already been applied. In other words, it is always safe to merge multipleupdate
invocations into a single invocation, with no change in semantics.Tarantool does nothing if a tuple with the specified primary key is not found.
Possible operators are:
+
for addition (values must be numeric)-
for subtraction (values must be numeric)&
for bitwise AND (values must be unsigned numeric)|
for bitwise OR (values must be unsigned numeric)^
for bitwise XOR (values must be unsigned numeric):
for string splice!
for insertion#
for deletion=
for assignment
For
!
and=
operations the field number can be-1
, meaning the last field in the tuple.Parameters: - space_object (space_object) – an object reference
- key (scalar/table) – primary-key field values, must be passed as a Lua table if key is multi-part
- operator (string) – operation type represented in string
- field_no (number) – what field the operation will apply to. The field number can be negative, meaning the position from the end of tuple. (#tuple + negative field number + 1)
- value (lua_value) – what value will be applied
Return: - the updated tuple
- nil if the key is not found
Rtype: tuple or nil
Possible errors: it is illegal to modify a primary-key field.
Complexity factors: Index size, Index type, number of indexes accessed, WAL settings.
Thus, in the instruction:
s:update(44, {{'+', 1, 55 }, {'=', 3, 'x'}})
the primary-key value is
44
, the operators are'+'
and'='
meaning add a value to a field and then assign a value to a field, the first affected field is field1
and the value which will be added to it is55
, the second affected field is field3
and the value which will be assigned to it is'x'
.Example:
Assume that initially there is a space named
tester
with a primary-key index whose type isunsigned
. There is one tuple, withfield[1]
=999
andfield[2]
='A'
.In the update:
box.space.tester:update(999, {{'=', 2, 'B'}})
The first argument istester
, that is, the affected space istester
. The second argument is999
, that is, the affected tuple is identified by primary key value = 999. The third argument is=
, that is, there is one operation — assignment to a field. The fourth argument is2
, that is, the affected field isfield[2]
. The fifth argument is'B'
, that is,field[2]
contents change to'B'
. Therefore, after this update,field[1]
=999
andfield[2]
='B'
.In the update:
box.space.tester:update({999}, {{'=', 2, 'B'}})
the arguments are the same, except that the key is passed as a Lua table (inside braces). This is unnecessary when the primary key has only one field, but would be necessary if the primary key had more than one field. Therefore, after this update,field[1]
=999
andfield[2]
='B'
(no change).In the update:
box.space.tester:update({999}, {{'=', 3, 1}})
the arguments are the same, except that the fourth argument is3
, that is, the affected field isfield[3]
. It is okay that, until now,field[3]
has not existed. It gets added. Therefore, after this update,field[1]
=999
,field[2]
='B'
,field[3]
=1
.In the update:
box.space.tester:update({999}, {{'+', 3, 1}})
the arguments are the same, except that the third argument is'+'
, that is, the operation is addition rather than assignment. Sincefield[3]
previously contained1
, this means we’re adding1
to1
. Therefore, after this update,field[1]
=999
,field[2]
='B'
,field[3]
=2
.In the update:
box.space.tester:update({999}, {{'|', 3, 1}, {'=', 2, 'C'}})
the idea is to modify two fields at once. The formats are'|'
and=
, that is, there are two operations, OR and assignment. The fourth and fifth arguments mean thatfield[3]
gets OR’ed with1
. The seventh and eighth arguments mean thatfield[2]
gets assigned'C'
. Therefore, after this update,field[1]
=999
,field[2]
='C'
,field[3]
=3
.In the update:
box.space.tester:update({999}, {{'#', 2, 1}, {'-', 2, 3}})
The idea is to deletefield[2]
, then subtract3
fromfield[3]
. But after the delete, there is a renumbering, sofield[3]
becomesfield[2]
before we subtract3
from it, and that’s why the seventh argument is2
, not3
. Therefore, after this update,field[1]
=999
,field[2]
=0
.In the update:
box.space.tester:update({999}, {{'=', 2, 'XYZ'}})
we’re making a long string so that splice will work in the next example. Therefore, after this update,field[1]
=999
,field[2]
='XYZ'
.In the update:
box.space.tester:update({999}, {{':', 2, 2, 1, '!!'}})
The third argument is':'
, that is, this is the example of splice. The fourth argument is2
because the change will occur infield[2]
. The fifth argument is 2 because deletion will begin with the second byte. The sixth argument is 1 because the number of bytes to delete is 1. The seventh argument is'!!'
, because'!!'
is to be added at this position. Therefore, after this update,field[1]
=999
,field[2]
='X!!Z'
.For more usage scenarios and typical errors see Example: using data operations further in this section.
-