db2主键自增、IDENTITY自增

db2设置主键自增

  • 一、方式一:IDENTITY设置主键自增
    • 1.1、语法一:GENERATED BY DEFAULT AS IDENTITY
      • 1.1.1、使用
      • 1.1.2、注意事项或坑
    • 1.2、语法二:GENERATED ALWAYS AS IDENTITY
  • 二、方式二:Sequence(了解)
    • 2.1、insert时使用Sequence
    • 2.2、查询下一个自增值
    • 2.3、查询上一个自增值或当前自增值
    • 2.4、查看Sequence信息
  • 三、扩展
    • 3.1、修改列为自增长
    • 3.2、修改列自增长起始值
    • 3.3、修改SEQUENCE起始值
    • 3.4、修改SEQUENCE序列信息
    • 3.5、删除SEQUENCE
  • 四、IDENTITY与Sequence的区别
  • 五、Sequence的原理

每种数据都有自己独特的自增列的声明方式,如 Oracle 的 Sequence, SQL Server 的 Identity, MySQL 的 auto_increment, PostgreSQL 的 Sequence 或 Serial。和 PostgreSQL 类似,DB2 也提供两种自增列的声明方式,它们是 Sequence 和 Identity。而本文主要着墨于 DB2 的 Identity 字段,并讲述它与 Sequence 的某种联系,以及它对数据表的导入的影响。

一、方式一:IDENTITY设置主键自增

说明:IDENTITY的原理其实是一个匿名的Sequence,底层被包装成了Sequence在处理。所以想要详细了解IDENTITY原理的人也可以看一下下面的Sequence内容。

identity更多内容参见官网: https://www.ibm.com/docs/en/db2/11.5?topic=statements-create-table#sdx-synid_identity-options

DB2中有两种方式指定字段自增长

 1.GENERATED BY DEFAULT AS IDENTITY --插入数据时允许指定自增字段的值,只要不重复即可,数据库会自动设置下一个值2.GENERATED ALWAYS AS IDENTITY --不允许指定,只能由数据库自动分配并插入

相同点
1、即使插入语句失败,标识列仍然自增(即插入失败也会自增一次)。
2、都可以重置起始值,语句:alter table [table_name] alter [col_name] restart with [x]

不同点
1、generated by default:可以修改自增列的值,手工指定标识列的值。
2、generated always :不可修改自增列的值,只能由系统生成。

1.1、语法一:GENERATED BY DEFAULT AS IDENTITY

CREATE TABLE t1(id INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1) primary key,name VARCHAR(400),age INTEGER
);
-- start with 1:id从1开始
-- increment by 1 :每次自增1

参数简介如下:

  • start with:指定序列的起始值,默认情况下,对于升序的序列是当前指定数据类型的最小值,对于降序序列的是当前指定类型的最大值。
  • increment by:指定增长的值,默认值为1,正数表示此序列为增长升序的,负数表示此序列为降序的。
  • minvalue:最小值,若降序序列,no cycle的话,到此值的时候就不再生成序列值了;
  • no minvalue:对于升序序列来说,此值为start with的值,如果start with值未指定的话就是1. 对于降序序列来说,此值就是指定数据类型的最小值。
  • maxvalue:指定生产序列的最大值,
  • no maxvalue:对于升序序列来说,此值为指定数据类型的最大值;
    对于降序序列来说,此值为start with值,若未指定start with值的话就是-1.
  • cycle:循环使用数据值,对于升序序列来说,当达到了最大值之后,下一个值将会是其最小值;
    对于降序序列来说,达到最小之后,下一个序列值为其最大值。
  • no cycle:当达到序列的边界值之后,就不再产生序列值,默认选项。
  • cache:缓存序列值,表示每次应用此序列的时候,预先生产并存放在内存中的序列值。

其作用是有效的降低了写日志的I/O操作。
若在使用的过程中,出现系统错误的话,那么所有这些缓存值将会丢失。
最小值为2,默认为20

  • no cache:当指定此选项的时候,内存中不会存储任何序列值,无论出现什么异常现象都不会影响到此序列,
    每次生存新的序列值,都会导致写日志的I/O操作。
  • order:按照请求的顺序生成值。
  • no order:不会按照请求的顺序生成值,默认情况。

1.1.1、使用

用法一:不指定id值,让数据库自增
insert into t1 (name,age) values('张三',11);
用法二:手动指定id值
insert into t1(id,name,age) values(2,'李四',12)

在这里插入图片描述

1.1.2、注意事项或坑

注意:若手动指定自增id值,当id自增到该值时,会报主键重复

案例描述: 以上述示例为参考,先插入一条数据,id自增为1;然后手动插入一条数据,指定id为2; 此时再插入一条数据,不手动指定id使用数据库自增,此时会报主键重复

问题分析: 猜测自增的id,数据库内存中会存储当前最大值。 手动插入的不会维护在内存中,导致继续按内存中的最大值进行自增,所以会有主键冲突问题。

案例示例

CREATE TABLE t1(id INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),name VARCHAR(400),age INTEGER,PRIMARY KEY (id)
);insert into t1 (name,age) values('张三',11);
insert into t1(id,name,age) values(2,'李四',12);
insert into t1 (name,age) values('王五',13);select * from t1;

在这里插入图片描述

报错内容:

[23505][-803] One or more values in the INSERT statement, UPDATE statement, or foreign key update caused by a DELETE statement are not valid because the primary key, 
unique constraint or unique index identified by "1" constrains table "TEST.T1" from having duplicate values for the index key.. SQLCODE=-803, SQLSTATE=23505, DRIVER=4.23.42

解决方法

方法一:设置t1表id从指定值之后开始自增
ALTER TABLE t1 ALTER COLUMN id RESTART WITH 18;方法二:重新执行一下插入语句即可。
原理:第一次插入失败后,自增值也会自增1,所以再执行一次就跳过那个重复值了。

1.2、语法二:GENERATED ALWAYS AS IDENTITY

CREATE TABLE t2(id INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1),name VARCHAR(400),age INTEGER,PRIMARY KEY (id)
);
-- start with 1:id从1开始
-- increment by 1 :每次自增1

使用示例

注意:insert语句中不能包含id字段,否则就报错。id只能由数据库自增
insert into t2 (name,age) values('张三',11);

加了id后就会报以下错误
在这里插入图片描述

二、方式二:Sequence(了解)

IBM 官方的相关文档 CREATE SEQUENCE statement

Sequence的方式比Identity要稍微麻烦一些,所以可以作为了解,主要还是使用IDENTITY。 IDENTITY的原理其实是一个匿名的Sequence,底层被包装成了Sequence在处理。

在 DB2 中声明一个 Sequence 与表的 Identity 字段的参数差不多,我们可以看作 Identity 是一个内联的 Sequence。先来看如何创建一个序列

语法:CREATE SEQUENCE <sequence-name>AS data-type                           默认 As IntegerSTART WITH <numeric-constant>   INCREMENT BY <numeric-constant>               默认 INCREMENT BY 1MINVALUE <numeric-constant> | NO MINVALUE    默认 NO MINVALUEMAXVALUE <numeric-constant> | NO MAXVALUE    默认 NO MAXVALUENO CYCLE | CYCLE                             默认 NO CYCLECACHE <numeric-constant> | NO CACHE          默认 CACHE 20NO ORDER | ORDER                             默认 NO ORDER示例:
CREATE SEQUENCE ORDER_SEQAS data-type  BIGINTSTART WITH 1    INCREMENT BY 1 CACHE 24;

参数简介如下

  • as datatype:指定数据类型,这里说明下,序列的数据类型只能为数值型,
    如,smallint,integer,bigint,不带小数点的decimal类型。

2.1、insert时使用Sequence

insert into  t1(id,name,age) values(NEXT VALUE for ORDER_SEQ,'scott',30);

使用的话,比如 insert, update 记录时用它的 NEXT VALUE FOR ORDER_SEQ 值,我们也可以查询到它的下一个值

SELECT NEXT VALUE FOR ORDER_SEQ FROM SYSIBM.SYSDUMMY1;

注意:每调用一次next value 就会使用掉一个自增id值

2.2、查询下一个自增值

NEXTVAL FOR 序列 
或
NEXT VALUE FOR 序列
或
select  <序列名>.nextval from SYSIBM.SYSDUMMY1;示例:
SELECT NEXTVAL FOR ORDER_SEQ FROM SYSIBM.SYSDUMMY1;
SELECT NEXT VALUE FOR ORDER_SEQ FROM SYSIBM.SYSDUMMY1;
select  ORDER_SEQ.nextval from SYSIBM.SYSDUMMY1;

2.3、查询上一个自增值或当前自增值

SELECT PREVIOUS VALUE FOR ORDER_SEQ FROM SYSIBM.SYSDUMMY1;

2.4、查看Sequence信息

SELECT * FROM sysibm.syssequences

三、扩展

3.1、修改列为自增长

当想将表中一列修改为自动增长时,可用下面命令:

语法:
alter table <table name> alter column <column name> set generated always as identity (start with 1,increment by 1);示例:设置user表id字段为自增长
alter table user alter column id set generated always as identity (start with 1,increment by 1);

3.2、修改列自增长起始值

当修改表中一列自动增长的开始值时,可用下面的命令:

语法:
ALTER TABLE <talbe_name> ALTER COLUMN <column name> RESTART WITH <起始值>;示例:设置user表id字段从18开始自增
ALTER TABLE user ALTER COLUMN id RESTART WITH 18;

3.3、修改SEQUENCE起始值

ALTER SEQUENCE 序列名  RESTART WITH 下一值示例:
alter sequence order_seq restart with 10;

3.4、修改SEQUENCE序列信息

修改最大值:   ALTER SEQUENCE <sequence_name> MAX VALUE <numeric-constant> | NO MAXVALUE
修改最小值:   ALTER SEQUENCE <sequence_name> MIN VALUE <numeric-constant> | NO MINVALUE (此值需要比当前值小)
修改步长:     ALTER SEQUENCE <sequence_name> INCREMENT BY <numeric-constant>;
修改CACHE值:  ALTER SEQUENCE <sequence_name> CACHE <numeric-constant> | NO CACHE
修改循环属性:  ALTER SEQUENCE <sequence_name> <CYCLE | NO CYCLE>
修改排序属性: ALTER SEQUENCE <sequence_name> <ORDER | NO ORDER>
从新计数:     ALTER SEQUENCE <sequence_name> RESTART | RESTART WITH <numeric-constant>

注意:
1、序列的数据类型不能修改,若要修改,只能删除当前序列,重建时指定想要的数据类型。
2、当修改的时候,所有的缓存值将会丢失。
3、当将序列修改为cycle之后,序列将会产生重复的值。

3.5、删除SEQUENCE

DROP SEQUENCE <sequence_name>;

四、IDENTITY与Sequence的区别

Identity字段与sequence的最大不同在于:
identity只能在一个表中使用,多个表不可以共享identity;而sequence可以通过命名方式在同一个数据库内部的多个表中共享序列号发生器

五、Sequence的原理

待补充,可见参考文章




参考文章:
https://blog.csdn.net/davidmeng10/article/details/46362997
https://blog.itpub.net/13165828/viewspace-609640/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/863063.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网管平台配置步骤详解

网管平台是现代运维工作中不可或缺的工具&#xff0c;它能够帮助运维人员实时监控网络状态、管理网络设备、排查网络故障等。本文将参考运维行业的经验&#xff0c;详细介绍网管平台的配置步骤&#xff0c;以期为运维人员提供实用的操作指南。 一、明确需求和目标 在进行网管平…

计算机视觉全系列实战教程 (十二):图像分割(阈值分割threshold、分水岭算法watershed的使用步骤、洪水填充floodFill算法的使用)

1.图像分割概述 (1)What(什么是图像分割) 将图像划分为不同的子区域&#xff0c;使得同一子区域具有较高的相似性&#xff0c;不同的子区域具有明显的差异性 (2)Why(对图像进行分割有什么作用) 医学领域&#xff1a;将不同组织分割成不同区域帮助分析病情军事领域&#xff…

微信商家转账到零钱

1.发起商家转账 发起商家转账接口。商户可以通过该接口同时向多个用户微信零钱进行转账操作。请求消息中应包含商家批次单号、转账名称、appid、转账总金额、转账总笔数、转账openid、收款用户姓名等信息。注意受理成功将返回批次单号&#xff0c;此时并不代表转账成功&#x…

JVM性能监控工具:JMX与VisualVM高级用法

在Java应用的开发和维护过程中&#xff0c;性能监控是一个不可或缺的环节。Java Management Extensions&#xff08;JMX&#xff09;和VisualVM是两个强大的工具&#xff0c;它们可以帮助开发者监控和管理Java应用程序的性能。本文将详细介绍如何使用JMX和VisualVM进行高级性能…

第二十站:Java未来光谱——量子计算与新兴技术的展望(第二篇)

在探讨Java与量子计算的未来融合时&#xff0c;我们首先要理解量子计算的基本概念及其与传统计算的区别。量子计算利用量子力学原理&#xff0c;如量子比特&#xff08;qubit&#xff09;的叠加态和纠缠效应&#xff0c;能在理论上实现远超经典计算机的计算速度&#xff0c;尤其…

缓存、数据库、搜索引擎、消息队列

缓存、数据库、搜索引擎、消息队列这四者都是应用依赖的后端基础服务&#xff0c;他们的性能直接影响到了应用的整体性能&#xff0c;有时候你代码写的再好也许就是因为这些服务导致应用性能无法提升上去。 缓存: 缓存通常被用来解决热点数据的访问问题&#xff0c;是提高数据查…

筑算网基石 创数智未来|锐捷网络闪耀2024 MWC上海

2024年6月26日至28日&#xff0c;全球科技界瞩目的GSMA世界移动大会&#xff08;MWC 上海&#xff09;在上海新国际博览中心&#xff08;SNIEC&#xff09;盛大召开。作为行业领先的网络解决方案提供商&#xff0c;锐捷网络以“筑算网基石 创数智未来”为主题&#xff0c;带来了…

Java程序员学习Go开发Higress的WASM插件

Java程序员学习Go开发Higress的WASM插件 契机 ⚙ 今年天池大赛有higress相关挑战&#xff0c;研究一下。之前没搞过go&#xff0c;踩了很多坑&#xff0c;最主要的就是tinygo打包&#xff0c;多方寻求解决无果&#xff0c;结论是tinygo0.32go1.19无法在macos arm架构下打包。…

SerDes介绍以及原语使用介绍(3)ISERDESE2原语介绍

文章目录 前言一、ISERDESE21.1、ISERDESE2端口信号1.1、ISERDESE2参数 二、BITSLIP-位滑动2.1、BITSLIP作用2.2、BITSLIP使用2.3、BITSLIP示例 前言 上文对OSERDESE进行了详细介绍并且进行了仿真分析&#xff0c;本文开始对ISERDES进行介绍&#xff0c; 一、ISERDESE2 不难…

云计算【第一阶段(20)】磁盘管理与文件系统 服务器硬件及RAID配置实战(三)

一、服务器硬件详解 cpu 主板 内存 硬盘 网卡 电源 raid卡 风扇 远程管理卡 1.1、硬盘尺寸 目前生产环境中主流的两种类型硬盘 3.5寸 和2.5寸硬盘 2.5寸硬盘可以通过使用硬盘托架后适用于3.5寸硬盘的服务器 但是3.5寸没法转换成2.5寸 二、RAID阵列详解 独立硬盘冗余阵…

SQL游标的基本使用方法与示例

SQL游标的基本使用方法与示例 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们来探讨SQL游标的基本使用方法及示例。在数据库编程中&#xff0c;游标是一…

高考后的抉择:是选择心仪的专业还是名校?

目录 一、选择专业的利与弊 1. 专业的深度培养 2. 兴趣的持续激发 3. 职业发展的方向 缺点&#xff1a; 二、选择学校的利与弊 1. 学术氛围的熏陶 2. 人脉资源的积累 3. 视野的拓展 缺点&#xff1a; 三、综合考量&#xff1a;专业优先还是学校优先&#xff1f; 1. …

【深度学习】图形模型基础(2):概率机器学习模型与人工智能

1.引言 1.1.背景 当机器需要从经验中汲取知识时&#xff0c;概率建模成为了一个至关重要的工具。它不仅为理解学习机制提供了理论框架&#xff0c;而且在实际应用中&#xff0c;特别是在设计能够从数据中学习的机器时&#xff0c;概率建模展现出了其独特的价值。概率框架的核…

不知道自己的优势擅长和兴趣爱好,我该如何填报高考志愿选专业?

天生我才必有用&#xff0c;每个人都是独立的个体&#xff0c;拥有自己的优势和擅长&#xff0c;当然这个优势和擅长&#xff0c;不是和别人对比&#xff0c;而是和自己对比产生的。 如果说你不知道自己的优势擅长&#xff0c;不知道自己的兴趣和爱好&#xff0c;那只不过是你没…

ES(笔记)

es就是json请求体代替字符串查询 dsl查询和过滤&#xff0c;一个模糊查询&#xff0c;一个非模糊查询 must&#xff0c;should 做模糊查询的&#xff0c;里面都是match&#xff0c;根据查询内容进行匹配&#xff0c;filter过滤&#xff0c;term词元查询&#xff0c;就是等值查…

html引入别的html文件(类似于框架的组件使用,只适合静态的,不适合组件传值)

接手了一个官网项目的开发,要求使用html原生去写,就不免有些头疼,像数据的响应式,组件化开发等这些框架带来的好处都用不了了,但是我需要使用使用组件以便于在各个页面引入开发,例如公共的导航栏,页脚等,这里给个案例可以使用html实现这种类似于组件的功能,这里不能组件互相传值…

cuda编码入门学习笔记

在日常深度学习和科学计算中,使用图形处理器(GPU)进行加速是一个常见的做法。CUDA (Compute Unified Device Architecture) 是英伟达公司提供的用于GPU编程的平台和编程模型。同时它是一种并行计算模型,允许开发人员使用标准C语言对GPU进行编程。CUDA的核心思想是将任务分解为…

The difference between Manhattan distance and Cosine Distance

题意&#xff1a;为什么即使返回了相同的文本块&#xff0c;曼哈顿距离&#xff08;Manhattan Distance&#xff09;和余弦距离&#xff08;Cosine Distance&#xff09;之间还是存在差异&#xff1f; 问题背景&#xff1a; I am using the qdrant DB and client for embeddin…

API-M端事件

学习目标&#xff1a; 掌握M端事件 学习内容&#xff1a; M端事件 M端事件&#xff1a; 移动端也有自己独特的地方。 比如触屏事件 touch&#xff08;也称触摸事件&#xff09;&#xff0c;Android和IOS都有。触屏事件 touch&#xff08;也称触摸事件&#xff09;&#xff0…

排序【插入排序】

排序的概念 排序&#xff1a;所谓排序&#xff0c;就是将一份数据&#xff0c;通过某个或者某些关键字的大小&#xff0c;进行递增或者递减排序的操作。 稳定性&#xff1a;假定在待排序的数据组中&#xff0c;存在多个相同的元素&#xff0c;若经过排序&#xff0c;这些数据…