达梦数据库-序列简介

序列-Sequence
是一种数据库对象,用于生成连续的、唯一的、数字序列
通常用于主键

用途与场景

  1. 主键生成,使用序列自动生成主键值
  2. 需要唯一标识的场景:如订单编号、票据号码、会员编号、商品编号等,都可以使用序列来生成唯一标识

DM序列用法

语法

CREATE SEQUENCE [IF NOT EXISTS] [<模式名>.]<序列名> [<序列选项列表>];
<序列选项列表> ::= <序列选项>{<序列选项>}
<序列选项> ::=
INCREMENT BY <增量值>|
START WITH <初值>|
MAXVALUE <最大值>|
NOMAXVALUE|
MINVALUE <最小值>|
NOMINVALUE|
CYCLE|
NOCYCLE|
CACHE <缓存值>|
NOCACHE|
ORDER |
NOORDER |
GLOBAL |
LOCAl

CYCLE:指定序列为循环序列:当序列的值达到最大值/最小值时,序列将从最小值/最大值计数
CACHE:表示序列的值是预先分配,并保持在内存中,以便更快地访问
<缓存值>指定预先分配的值的个数,最小值为2;最大值为50000
ORDER:保证在集群环境中也唯一且按顺序递增
在集群环境中,多个数据库实例可能同时访问和修改同一个序列
当设置为NOORDER时,序列值的生成不需要在集群环境中按顺序产生。这可能会导致不同节点上的序列值出现“跳跃”或“不连续”的情况,因为每个节点可能会根据自己的缓存和请求情况来生成序列值。然而,这并不会影响序列值的唯一性
ORDER选项不影响单实例数据库

序列的使用

在sql中用伪列获取序列的值
CURRVAL:当前值
NEXTVAL:如果为升序序列,序列值增加并返回增加后的值;如果为降序序列,序列值减少并返回减少后的值。如果第一次对序列使用该函数,则返回序列当前值
用户会话在第一次使用 CURRVAL 之前应先使用 NEXTVAL 获取序列当前值;之后除非会话使用 NEXTVAL 获取序列当前值,否则每次使用 CURRVAL 返回的值不变

示例

创建序列

--创建序列,执行如下SQL命令
CREATE SEQUENCE SEQ_FUT_XLGL_CJ INCREMENT BY 10 START WITH 1  CYCLE CACHE 10 ORDER;

调用序列生成序列值

--创建测试表,执行如下SQL命令:
Create table TAB_FUT_XLGL_CJ(C1 int,C2 varchar(10) );
--将序列的前两个值插入到表中,执行如下SQL命令
insert into TAB_FUT_XLGL_CJ values(SEQ_FUT_XLGL_CJ.nextval,'test');
insert into TAB_FUT_XLGL_CJ values(SEQ_FUT_XLGL_CJ.nextval,'test2');
--查询表数据,执行如下SQL命令
select * from TAB_FUT_XLGL_CJ;
返回结果集:
C1	C2
1	test
11	test2

查看序列当前值、下一个值

--获取序列的当前值,执行如下SQL命令
select SEQ_FUT_XLGL_CJ.CURRVAL;
-- 返回11
--获取序列的下一个值,执行如下SQL命令
select SEQ_FUT_XLGL_CJ.nextval;
-- 返回21

修改序列

--修改序列,执行如下SQL命令
ALTER SEQUENCE SEQ_FUT_XLGL_CJ INCREMENT BY 2 ;

修改序列当前值

--查询序列当前值
select SEQ_FUT_XLGL_CJ.nextval;
--修改序列当前值,比如当前值为1,这里设置当前值为10,执行如下SQL命令
alter SEQUENCE SEQ_FUT_XLGL_CJ CURRENT VALUE 10;
select SEQ_FUT_XLGL_CJ.nextval;
最后查看结果集为:
NEXTVAL
10

删除序列

--删除序列,执行如下SQL命令
drop SEQUENCE SEQ_FUT_XLGL_CJ;

参考:
https://eco.dameng.com/

<think>嗯,用户问的是达梦数据库序列注解主键。我需要先理解这两个概念:序列和主键,以及它们在达梦中的结合使用。 首先,达梦序列是用于生成唯一数字的对象,常用于主键自增。主键则是用来唯一标识表中每行数据的字段。注解主键可能指的是通过注释(comment)来说明主键的用途,或者在创建时用某种注解语法? 但用户提到的是“序列注解主键”,可能是指在使用序列作为主键时,如何通过注解或配置来实现。比如在创建表时,如何将主键字段与序列关联起来,使其自动生成值。 达梦数据库中的自增列通常可以用序列配合默认值来实现。例如,在创建表时,主键字段的默认值设置为某个序列的下一个值。或者使用IDENTITY属性,但不同数据库可能有不同语法。 需要确认达梦的具体语法。比如,是否支持在列定义中直接引用序列,或者使用类似Oracle的触发器机制?可能达梦有更简洁的方式,比如在创建表时指定列的默认值为NEXTVAL('序列名')。 另外,用户可能想知道如何通过SQL语句或工具来为这样的主键添加注释,即注解。添加注释通常使用COMMENT ON语句,例如给列或表添加注释。 需要注意达梦的文档是否支持在序列或主键上添加注释,以及具体的语法。可能需要分开处理:创建序列,创建表时指定主键默认值为序列的NEXTVAL,然后添加注释到主键列。 可能步骤: 1. 创建序列 2. 创建表时,主键字段的默认值为序列.NEXTVAL 3. 使用COMMENT ON为主键列添加注释 需要验证达梦是否允许在DEFAULT子句中直接使用序列的NEXTVAL,或者是否有其他限制。例如,达梦可能需要使用触发器来自动获取序列值,或者支持类似Oracle的自动递增列设置。 另外,可能用户混淆了术语,是否“注解”指的是类似JPA中的注解,如Hibernate的@GeneratedValue来指定序列?如果是这样,可能涉及应用层配置,但用户的问题更偏向数据库本身的实现。 总结,回答应分步骤说明如何在达梦中使用序列作为主键的自增机制,并添加注释。需要确保语法正确,例如使用正确的关键字和函数,以及注释的添加方式。</think>在达梦数据库中,序列(Sequence)和主键(Primary Key)是数据库设计中两个重要概念。结合使用时,可以通过序列为主键字段自动生成唯一值。以下是分步说明: --- ### **1. 序列(Sequence)** 序列数据库生成唯一数值的对象,常用于为表的主键提供自增或按规则递增的值。 **创建序列语法:** ```sql CREATE SEQUENCE <序列名> START WITH <初始值> INCREMENT BY <步长> MINVALUE <最小值> MAXVALUE <最大值> CACHE <缓存数量>; ``` **示例:** ```sql CREATE SEQUENCE SEQ_USER_ID START WITH 1000 INCREMENT BY 1 MINVALUE 1000 MAXVALUE 999999 CACHE 20; ``` --- ### **2. 主键(Primary Key)** 主键是表中唯一标识每一行数据的字段。达梦数据库支持通过以下两种方式为主键赋值: - **自增列(IDENTITY)**:内置的自动递增机制。 - **序列绑定**:通过序列生成唯一值。 --- ### **3. 使用序列注解主键** 若需通过序列为主键赋值,需在创建表时指定列的默认值为序列的下一个值。 **步骤:** 1. **创建序列**(如上述 `SEQ_USER_ID`)。 2. **创建表时绑定序列到主键**: ```sql CREATE TABLE USER ( ID INT PRIMARY KEY DEFAULT SEQ_USER_ID.NEXTVAL, NAME VARCHAR(50) ); ``` - `DEFAULT SEQ_USER_ID.NEXTVAL` 表示主键 `ID` 的默认值由序列 `SEQ_USER_ID` 的下一个值填充。 --- ### **4. 添加注释(注解)** 若需为字段添加注释,使用 `COMMENT ON` 语法: ```sql COMMENT ON COLUMN USER.ID IS '主键,由序列SEQ_USER_ID自动生成'; ``` --- ### **5. 验证操作** - **插入数据测试**: ```sql INSERT INTO USER (NAME) VALUES ('张三'); INSERT INTO USER (NAME) VALUES ('李四'); ``` 执行后,`ID` 字段会自动填充为 `1000`, `1001`(由序列生成)。 - **查询数据**: ```sql SELECT * FROM USER; ``` --- ### **注意事项** 1. **序列与事务**:达梦序列的值是全局唯一的,不受事务回滚影响。 2. **性能优化**:设置 `CACHE` 参数可提高序列生成效率,但缓存丢失可能导致序列值不连续。 3. **替代方案**:达梦支持 `IDENTITY` 自增列,语法更简洁: ```sql CREATE TABLE USER ( ID INT PRIMARY KEY IDENTITY(1, 1), NAME VARCHAR(50) ); ``` --- ### **总结** 通过序列为主键赋值,可实现灵活的自增逻辑(如自定义步长、循环规则等)。结合注释(`COMMENT ON`)可增强字段含义的可读性,是达梦数据库表设计的常用实践。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值