自增字段

概念

自增字段是集合中可以自动生成唯一序列的字段。集合允许拥有多个自增字段。

为保证高性能,自增字段的序列值是在编目节点中统一生成,并批量分配给协调节点的。因此默认地,自增字段的值只保证趋势递增(或递减),但不保证连续分配。以递增序列为例,如果多个协调节点同时插入数据,在小的区间内,可能会出现后插入的文档的序列值比先插入的小,但在大的区间内,数值是递增的。如需连续递增,也可以设置有关属性来实现。

属性

属性名类型必填默认值描述
FieldString-自增字段名,必须是可见字符,不能以“$”或空白字符起始
IncrementInt321自增字段每次增加的间隔,可以为正整数或负整数,不能为0
StartValueInt641自增字段的起始值
CurrentValueInt64--自增字段的当前值,可以在序列快照中查看。不能创建时指定
MinValueInt641自增字段的最小值
MaxValueInt64263 -1自增字段的最大值
CacheSizeInt321000编目节点每次缓存的序列值的数量,取值须大于0
AcquireSizeInt321000协调节点每次获取的序列值的数量,取值须大于0,小于等于CacheSize
CycledBoolfalse序列值达到最大值或最小值时是否允许循环
GeneratedString“default”自增字段生成方式,取值为”always”, “default”或”strict”。
“always” 表示自增字段总是由服务端生成,忽略客户端的设置;
“default” 表示缺省时生成,允许客户端的设置;
“strict” 则在允许客户端设置的同时增加类型检测,类型不为数值时报错。

Note:

  • 自增字段可以是嵌套字段。
  • Increment为正整数时,StartValue默认为1,MinValue默认为1,MaxValue默认为263 -1。
    Increment为负整数时,StartValue默认为-1,MinValue默认为-263 ,MaxValue默认为-1。
  • StartValue必须位于[MinValue,MaxValue]区间。
  • 当设置AcquireSize为1时,可以实现序列连续递增(或递减)。CacheSize和AcquireSize是性能相关的参数,建议谨慎修改。
  • 使用主子表时,仅主表自增字段会生效,子表自增字段无效。
  • 如客户端设置过自增字段的值,或使用中修改过自增字段的属性,字段值将可能不唯一。如需保证修改后值唯一,建议使用唯一索引。
  • 独立节点不支持自增字段。

SequoiaDB Shell支持的操作

示例

  1. 在创建集合时指定自增字段为studentID。

    1. > db.foo.createCL("bar", { AutoIncrement: { Field: "studentID" } })
    2. localhost:11810.foo.bar
    3. Takes 0.586001s.
    4. > db.foo.bar.insert({ name: "Tom" })
    5. Takes 0.033371s.
    6. > db.foo.bar.find()
    7. {
    8. "_id": {
    9. "$oid": "5bd7da4260ff5166c507aa22"
    10. },
    11. "name": "Tom",
    12. "studentID": 1
    13. }
    14. Return 1 row(s).
    15. Takes 0.006712s.
  2. 在集合上创建起始值为5000自增字段,并修改增加间隔为10。然后查看集合自增字段属性。

    1. > db.foo.bar.createAutoIncrement({ Field: "studentID", StartValue: 5000 })
    2. Takes 0.069783s.
    3. > db.foo.bar.setAttributes({ AutoIncrement: { Field: "studentID", Increment: 10 } })
    4. Takes 0.039292s.
    5. >
    6. > db.snapshot( SDB_SNAP_CATALOG, { Name: "foo.bar" }, { AutoIncrement: 1 } )
    7. {
    8. "AutoIncrement": [
    9. {
    10. "SequenceName": "SYS_21333102559237_studentID_SEQ",
    11. "Field": "studentID",
    12. "Generated": "default",
    13. "SequenceID": 4
    14. }
    15. ]
    16. }
    17. Return 1 row(s).
    18. Takes 0.006737s.
    19. >
    20. > db.snapshot( SDB_SNAP_SEQUENCES, { Name: "SYS_21333102559237_studentID_SEQ" } )
    21. {
    22. "AcquireSize": 1000,
    23. "CacheSize": 1000,
    24. "CurrentValue": 5000,
    25. "Cycled": false,
    26. "ID": 4,
    27. "Increment": 10,
    28. "Initial": true,
    29. "Internal": true,
    30. "MaxValue": {
    31. "$numberLong": "9223372036854775807"
    32. },
    33. "MinValue": 1,
    34. "Name": "SYS_21333102559237_studentID_SEQ",
    35. "StartValue": 5000,
    36. "Version": 1,
    37. "_id": {
    38. "$oid": "5bd8fcfc8af29ca6ad2a32e8"
    39. }
    40. }
    41. Return 1 row(s).
    42. Takes 0.012240s.
  3. 在集合上创建一个嵌套和非嵌套的自增字段,然后删除非嵌套的字段。

    1. > db.foo.bar.createAutoIncrement([ { "Field": "No" }, { Field: "student.ID" } ])
    2. Takes 0.628813s.
    3. > db.foo.bar.insert({ student: { "name": "Tom" } })
    4. Takes 0.006884s.
    5. > db.foo.bar.find()
    6. {
    7. "_id": {
    8. "$oid": "5bd7e2478c74f9c1a14366ca"
    9. },
    10. "student": {
    11. "name": "Tom",
    12. "ID": 1
    13. },
    14. "No": 1
    15. }
    16. Return 1 row(s).
    17. Takes 0.007183s.
    18. > db.foo.bar.dropAutoIncrement("No")
    19. Takes 0.066828s.
    20. > db.foo.bar.insert({ student: { "name": "Jerry" } })
    21. Takes 0.003347s.
    22. > db.foo.bar.find()
    23. {
    24. "_id": {
    25. "$oid": "5bd7e2478c74f9c1a14366ca"
    26. },
    27. "student": {
    28. "name": "Tom",
    29. "ID": 1
    30. },
    31. "No": 1
    32. }
    33. {
    34. "_id": {
    35. "$oid": "5bd7e2b08c74f9c1a14366cb"
    36. },
    37. "student": {
    38. "name": "Jerry",
    39. "ID": 2
    40. }
    41. }
    42. Return 2 row(s).
    43. Takes 0.010535s.