数据库auto属性

1.sqlite3

  两种方式设置auto:

  1.  建表时隐式创建它INTEGER PRIMARY KEY
  2. 使用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

猜你喜欢

转载自blog.csdn.net/yshhuan/article/details/110470243
今日推荐