MYSQL——数据库的自增id类型

摘要

MySQL 里有很多自增的 id,每个自增 id 都是定义了初始值,然后不停地往上加步长。虽然自然数是没有上限的,但是在计算机里,只要定义了表示这个数的字节长度,那它就有上限。比如,无符号整型 (unsigned int) 是 4 个字节,上限就是 2^32-1。既然自增 id 有上限,就有可能被用完。但是,自增 id 用完了会怎么样呢?

一、表定义自增值 id

说到自增 id,你第一个想到的应该就是表结构定义里的自增字段和你介绍过的自增主键 id。表定义的自增值达到上限后的逻辑是:再申请下一个 id 时,得到的值保持不变。

我们可以通过下面这个语句序列验证一下:

<
### 数据库中自 ID 作为主键的使用方法 #### SQLite 中自 ID 的实现方式 在 SQLite 中,定义带有自动量特性的主键非常简单。创建表格时只需声明 `INTEGER PRIMARY KEY AUTOINCREMENT` 即可使该字段具备自长属性[^1]。 ```sql CREATE TABLE testTable ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL ); ``` 当向此表插入新记录而未提供显式的 `id` 值时,SQLite 将自动分配一个新的唯一整数值给这个字段。需要注意的是,在 SQLite 中应严格采用 `INTEGER` 类型而非简单的 `INT` 来配合 `AUTOINCREMENT` 关键字,否则可能导致错误发生。 为了获取刚刚插入行所对应的自动生成的主键值,可以利用 SQL 函数如 `last_insert_rowid()` 或者通过编程接口提供的相应机制来取得这一信息: ```sql INSERT INTO testTable(name) VALUES('example'); SELECT last_insert_rowid(); ``` #### Oracle 中自 ID 实现方案 对于 Oracle 数据库而言,并不存在直接支持类似 MySQL/SQLite 那样的内置自列概念;相反地,通常借助于序列(Sequence)对象加上触发器(Trigger)的方式来模拟这种行为[^2]。 首先建立一个用于生成连续编号的序列: ```sql CREATE SEQUENCE seq_for_xtbf START WITH 1 INCREMENT BY 1; ``` 接着针对目标表编写触发器代码片段如下所示: ```sql CREATE OR REPLACE TRIGGER trg_autoinc_id BEFORE INSERT ON your_table_name FOR EACH ROW BEGIN SELECT seq_for_xtbf.NEXTVAL INTO :new.id FROM DUAL; END; / ``` 每当执行插入操作前都会触发上述逻辑从而完成主键赋值过程。 #### 达梦数据库中的处理办法 达梦数据库提供了两种主要途径来设定具有递值特征的主键——一是基于 `IDENTITY` 列特性,二是运用序列加触发器组合形式[^3]。 如果选用前者,则只需要按照常规建表语句格式加入额外选项即可达成目的: ```sql CREATE TABLE dm_test ( id BIGINT GENERATED ALWAYS AS IDENTITY (START WITH 1), info VARCHAR(50) ); ``` 而对于后者来说,除了要预先准备好相应的序列外还需要构建合适的触发器以确保每次新数据项都能获得恰当的身份标识符。 无论采取哪种策略都应当注意以下几点: - 应用程序层面不应尝试覆盖由系统负责管理的部分; - 正确配置好所有涉及的对象命名空间及其参数设置; - 考虑到性能优化方面的要求决定是否开启缓存功能以及权衡潜在风险因素的影响程度; - 及时跟踪官方发布的最新资料以便掌握任何可能存在的变动情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

庄小焱

我将坚持分享更多知识

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值