1.sqlite3
两种方式设置auto:
- 建表时隐式创建它INTEGER PRIMARY KEY
- 使用AUTOINCREMENT关键字显式创建
方式1利用了rowid; 方式2是另一套不同的算法,采用了中间表SQLITE_SEQUENCE table记录增长。详细介绍见官网:https://sqlite.org/autoinc.html
AUTOINCREMENT:
AUTOINCREMENT的主键必须是INTEGER类型,但是INTEGER类型的主键本身默认就是自动增长的。
AUTOINCREMENT并不是字面上“自动增长”的意思(或许2.3.4版本以前是,但现在不是),而是表示当id等于最大支持的数后(9223372036854775807),再插入数据时可以重复使用原来已删除或没有使用的行。AUTOINCREMENT的一个缺点是,它使用了额外的CPU,内存,磁盘空间和磁盘I/O开销。
对INTEGER PRIMARY KEY手动插入一个后续值比如20,而auto之前的值小于20,当auto下一个为20时,sqlite3不会出错,会自动检测。
2.PostgreSQL
PostgreSQL数据类型为smallserial,serial和bigserial时,拥有类似于某些其他数据库支持的AUTO_INCREMENT属性。这些不是真实的类型,而仅仅为了创建唯一标识符列的符号方便。类型名称bigserial创建一个bigint列,类型名称smallserial将创建一个smallint列。
通过将SERIAL伪类型分配给id列,PostgreSQL执行以下操作:
- 首先,创建一个序列对象,并将该序列生成的下一个值设置为该列的默认值。
- 其次,将NOT NULL 约束添加到id列,因为序列始终会生成一个整数,该整数是非空值。
- 第三,将序列的所有者分配给该id列;结果,当删除id列或表时,将删除序列对象
创建序列对象语法:
CREATE [ TEMPORARY | TEMP ] SEQUENCE name [ INCREMENT [ BY ] increment ]
[ MINVALUE minvalue | NO MINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE ]
[ START [ WITH ] start ] [ CACHE cache ] [ [ NO ] CYCLE ]
[ OWNED BY { table.column | NONE } ]
示例:
create sequence tbl_xulie2_id_seq increment by 1 minvalue 1 no maxvalue start with 1;
注意:
序列(serial) 字段的默认值并不是强制使用的。用户仍然可以手动插入值,这样潜在地造成与未来的序列值冲突的风险。
eg:
pg对auto手动插入一个后续值比如20,而auto之前的值小于20,当auto下一个为20时,省略auto列插入会出错,因为没有同步手动插入的值。
解决办法:
SELECT setval(pg_get_serial_sequence(tablename, colname), (SELECT MAX(colname) FROM tablename))
即 使用内置函数更新序列对象的值
3.MySQL
用法:
定义列后属性增加AUTO_INCREMENT
可以使用LAST_INSERT_ID()
SQL函数或mysql_insert_id()
C API函数检索最新自动生成的值 。这些函数是特定于连接的,因此它们的返回值不受也执行插入操作的另一个连接的影响。
设置auto起始值:
要以AUTO_INCREMENT非1的值开头,请使用CREATE TABLE或设置该值ALTER TABLE,如下所示:
mysql> ALTER TABLE tbl AUTO_INCREMENT = 100;
对auto手动插入一个后续值比如20,而auto之前的值小于20,当auto下一个为20时,mysql不会出错,会自动检测。
4.mongo
mongo的_id列是ObjectID类型时,是可以有auto属性的,但是不是自增的。整形是不支持auto属性的。
以下给出整形的autoincrement实现:
- 一个数据库需要一张专门记录auto列值的变化,以(表名,auto列名)为唯一索引;
- findAndModify 是原子操作,可以实现对应auto列值的修改,并将修改后值返回
db.getCollection("auto").findAndModify({
query:
_id: "tablename+colname"
},
update: {
$inc: {
autoval: 1
}
},
new: true,
upsert: true
})
记录一下mongo go driver 与Mongo类型转化:
mongo go driver => mongo:
int =>NumberInt
int64, uint,uint64 =>NumberLong
mongo =>mongo go driver
NumberInt=>int
NumberLong=>int64