Using sequences
A sequence is a generator of ordered integer values.
As with spaces and indexes, you should specify the sequence name and let Tarantool generate a unique numeric identifier (sequence ID).
As well, you can specify several options when creating a new sequence. The options determine the values that are generated whenever the sequence is used.
Option name | Type and meaning | Default | Examples |
---|---|---|---|
start |
Integer. The value to generate the first time a sequence is used | 1 | start=0 |
min |
Integer. Values smaller than this cannot be generated | 1 | min=-1000 |
max |
Integer. Values larger than this cannot be generated | 9223372036854775807 | max=0 |
cycle |
Boolean. Whether to start again when values cannot be generated | false | cycle=true |
cache |
Integer. The number of values to store in a cache | 0 | cache=0 |
step |
Integer. What to add to the previous generated value, when generating a new value | 1 | step=-1 |
if_not_exists |
Boolean. If this is true and a sequence with this name exists already, ignore other options and use the existing values | false |
if_not_exists=true |
Once a sequence exists, it can be altered, dropped, reset, forced to generate the next value, or associated with an index.
First, create a sequence:
-- Create a sequence --
box.schema.sequence.create('id_seq',{min=1000, start=1000})
--[[
---
- step: 1
id: 1
min: 1000
cache: 0
uid: 1
cycle: false
name: id_seq
start: 1000
max: 9223372036854775807
...
--]]
The result shows that the new sequence has all default values,
except for the two that were specified, min
and start
.
Get the next value from the sequence by calling the next()
function:
-- Get the next item --
box.sequence.id_seq:next()
--[[
---
- 1000
...
--]]
The result is the same as the start value. The next call increases the value by one (the default sequence step).
Create a space and specify that its primary key should be generated from the sequence:
-- Create a space --
box.schema.space.create('customers')
-- Create an index that uses the sequence --
box.space.customers:create_index('primary',{ sequence = 'id_seq' })
--[[
---
- parts:
- type: unsigned
is_nullable: false
fieldno: 1
sequence_id: 1
id: 0
space_id: 513
unique: true
hint: true
type: TREE
name: primary
sequence_fieldno: 1
...
--]]
Insert a tuple without specifying a value for the primary key:
-- Insert a tuple without the primary key value --
box.space.customers:insert{ nil, 'Adams' }
--[[
---
- [1001, 'Adams']
...
--]]
The result is a new tuple where the first field is assigned the next value from the sequence. This arrangement, where the system automatically generates the values for a primary key, is sometimes called “auto-incrementing” or “identity”.
For syntax and implementation details, see the reference for box.schema.sequence.