использование последовательностей в create_index()
-
object
space_object
¶ -
space_object:
create_index
(... [sequence='...' option] ...)¶ Можно использовать опцию
sequence=имя-последовательности
(илиsequence=id-последовательности
, илиsequence=true
) при создании или изменении первичного индекса. Происходит ассоциация последовательности с индексом, так что следующий вызовinsert()
поместит следующее сгенерированное число в поле первичного ключа, если в противном случае поле было бы nil.The syntax may be any of:
sequence = sequence identifier
orsequence = {id =
sequence identifier
}
orsequence = {field =
field number
}
orsequence = {id =
sequence identifier
, field =
field number
}
orsequence = true
orsequence = {}
.
The sequence identifier may be either a number (the sequence id) or a string (the sequence name). The field number may be the ordinal number of any field in the index; default = 1. Examples of all possibilities:sequence = 1
orsequence = 'sequence_name'
orsequence = {id = 1}
orsequence = {id = 'sequence_name'}
orsequence = {id = 1, field = 1}
orsequence = {id = 'sequence_name', field = 1}
orsequence = {field = 1}
orsequence = true
orsequence = {}
. Notice that the sequence identifier can be omitted, if it is omitted then a new sequence is created automatically with default name =space-name_seq
. Notice that the field number does not have to be 1, that is, the sequence can be associated with any field in the primary-key index.Например, если „Q“ – это последовательность, а „T“ – это новый спейс, то сработает:
tarantool> box.space.T:create_index('Q',{sequence='Q'}) --- - unique: true parts: - type: unsigned is_nullable: false fieldno: 1 sequence_id: 8 id: 0 space_id: 514 name: Q type: TREE ...
(Обратите внимание, что теперь в индексе есть поле идентификатора последовательности
sequence_id
.)И сработает:
tarantool> box.space.T:insert{box.NULL,0} --- - [1, 0] ...
Примечание
The index key type may be either „integer“ or „unsigned“. If any of the sequence options is a negative number, then the index key type should be „integer“.
Users should not insert a value greater than 9223372036854775807, which is 2^63 - 1, in the indexed field. The sequence generator will ignore it.
Последовательность нельзя удалить, если она связана с индексом. Тем не менее, можно использовать index_object:alter(), чтобы показать, что последовательность не связана с индексом, например так
box.space.T.index.I:alter({sequence=false})
.If a sequence was created automatically because the sequence identifier was omitted, then it will be dropped automatically if the index is altered so that
sequence=false
, or if the index is dropped.index_object:alter()
can also be used to associate a sequence with an existing index, with the same syntax for options.When a sequence is used with an index based on a JSON path, inserted tuples must have all components of the path preceding the autoincrement field, and the autoincrement field. To achieve that use
box.NULL
rather thannil
. Example:s = box.schema.space.create('test') s:create_index('pk', {parts = {{'[1].a.b[1]', 'unsigned'}}, sequence = true}) s:replace{} -- error s:replace{{c = {}}} -- error s:replace{{a = {c = {}}}} -- error s:replace{{a = {b = {}}}} -- error s:replace{{a = {b = {nil}}}} -- error s:replace{{a = {b = {box.NULL}}}} -- ok
-