关于数据库中的主键的自动增长
- 格式:doc
- 大小:26.50 KB
- 文档页数:3
如何轻松实现DB2自动增长主键?以下的文章主要描述的是DB2自动增长主键的方法,如果你对DB2自动增长主键的方法有兴趣的话,你就可以对以下的文章点击观看了,以下就是具体方案的描述,希望在你今后的学习中会有所帮助。
我们大家都知道DB2数据库可以使用generated always as identity ,将某一个字段指定为自增长的字段,比如:这表示id自动是一个自增长的字段,它从1开始增加每次增加1。
也可以通过generated 将字段的值通过其他字段的计算的来,比如;从1开始自增,每次加1.DB2 Identity字段与 sequence:Identity字段与sequence的最大不同在于:identity只能在一个表中使用,多个表不可以共享identity;而sequence可以通过命名方式在同一个数据库内部的多个表中共享序列号发生器生成数字序列的两种方法在 DB2 中可以用两种方法自动生成一个数字序列:定义带有 IDENTITY 属性的列。
创建 SEQUENCE 对象。
IDENTITY 列当用 IDENTITY 属性定义表的列时,每当将一行插入表时,就会自动为该列生成一个数值。
SEQUENCE 对象让 DB2 自动生成数字序列的第二种方法是创建 SEQUENCE 对象。
可以使用序列表达式(sequence expression)来引用序列对象。
序列表达式可以出现在表达式能够出现的大多数位置。
序列表达式可以指定要返回的值是新生成的值还是以前生成的值。
如果序列引用是针对下一值(next value),就会为序列自动生成一个数值,并将该数值作为序列表达式的结果返回。
例如,如果我们假设已经创建了名为 orders_seq 的序列,该序列表达式就返回为序列生成的下一个值:NEXT VALUE FOR orders_seq如果序列引用是针对前一值(previous value),那么会将前一个 SQL 语句中为序列生成的数值作为序列表达式的结果返回。
ORACLE数据库实现主键⾃增ORACLE数据库是甲⾻⽂公司的⼀款关系数据库管理系统。
实现主键⾃动增长需要四个步骤:1.创建表格(必须有主键)-- 创建学⽣表(student)主键为:s_idCREATE TABLE student(s_id NUMBER(10) NOT NULL PRIMARY KEY ,-- 主键列 s_ids_name VARCHAR2(50), -- 学⽣姓名 s_names_age NUMBER(8) -- 学⽣年龄 s_age);2.创建⾃增序列-- 创建⾃增序列(seq_student)CREATE SEQUENCE seq_studentINCREMENT BY1--每次增加1,可以写⾮0的任何整数START WITH1-- 从1开始(起始值)MAXVALUE 999-- 设置最⼤值:设置为 NOMAXVALUE 表⽰⽆最⼤值MINVALUE 1-- 设置最⼩值NOCYCLE -- 不循环⼀直增加CACHE 20; -- 设置20个缓存,不使⽤缓存则写 NOCACHE到这⼀步就可以使⽤了,不过使⽤的时候必须按格式调⽤格式:⾃增序列的名字.nextval (我这⾥的序列名为seq_student )insert into student values (seq_student.nextval,'李四',28);3.创建触发器(插⼊数据时触发)create trigger tri_student_ins --每个触发器名不可⼀样before insert on student for each row when (new.s_id is null) --student:换为⾃⼰的表名;s_id 换为⾃⼰的主键名beginselect seq_student.nextval into:new.s_id from dual; -- seq_student:换为上⼀步创建的⾃增序列名;s_id 换为主键名end;4.插⼊数据测试insert into student values (DEFAULT,'测试',28);注意点:1.创建表格时:必须有主键!2.创建⾃增序列时:序列名不要太复杂,id⾃增根据功能灵活变通!3.创建触发器时:根据⾃⼰的表名,主键名,序列名更换需要更换的位置。
MySql 主键自动增长Mysql,SqlServer,Oracle主键自动增长设置1、把主键定义为自动增长标识符类型MySql在mysql中,如果把表的主键设为auto_increment类型,数据库就会自动为主键赋值。
例如:createtable customers(id int auto_increment primarykey not null, name varchar(15));insertinto customers(name) values("name1"),("name2");select id from customers;以上sql语句先创建了customers表,然后插入两条记录,在插入时仅仅设定了name字段的值。
最后查询表中id字段,查询结果为:由此可见,一旦把id设为auto_increment类型,mysql数据库会自动按递增的方式为主键赋值。
Sql Server在MS SQLServer中,如果把表的主键设为identity类型,数据库就会自动为主键赋值。
例如:createtable customers(id int identity(1,1) primarykey not null, name varchar(15));insertinto customers(name) values('name1'),('name2');select id from customers;注意:在sqlserver中字符串用单引号扩起来,而在mysql中可以使用双引号。
查询结果和mysql的一样。
由此可见,一旦把id设为identity类型,MS SQLServer数据库会自动按递增的方式为主键赋值。
identity包含两个参数,第一个参数表示起始值,第二个参数表示增量。
以前经常会碰到这样的问题,当我们删除了一条自增长列为1的记录以后,再次插入的记录自增长列是2了。
mybatis insert时主键自增原理MyBatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。
MyBatis 允许你在不改变任何代码的情况下,通过修改配置文件来改变 SQL 语句的执行。
当你在使用 MyBatis 进行数据库插入操作时,如果你在数据库表定义中设置了某个字段为主键,并且这个主键是自增的(通常是 INT 或 BIGINT 类型,并设置为 AUTO_INCREMENT 在 MySQL 中),那么 MyBatis 插入操作时不需要你为这个主键字段提供值。
MyBatis 的插入操作流程大致如下:1. 映射文件配置:首先,你需要在 MyBatis 的映射文件中定义 SQL 插入语句。
这个插入语句中通常会包括所有要插入的字段,但主键字段的值通常是`{id}` 或其他表示占位符的方式。
2. 生成 PreparedStatement:MyBatis 在执行插入操作时,会根据映射文件中定义的 SQL 语句和传入的对象(通常是一个 JavaBean)来生成一个PreparedStatement。
3. 设置参数:MyBatis 会遍历传入对象的属性,并将属性值设置到PreparedStatement 的参数中。
对于主键字段,由于它被配置为自增,MyBatis 不会为其设置具体的值,而是让数据库自动生成。
4. 执行 SQL:最后,MyBatis 会执行这个 PreparedStatement,将数据插入到数据库中。
在这个过程中,数据库会自动为主键字段生成一个唯一的值(通常是递增的)。
MyBatis 的主要工作是构建 SQL 语句和参数绑定,而不是处理主键生成这样的逻辑。
这使得 MyBatis 可以很好地与各种不同类型的数据库配合工作,只要数据库支持自增主键的功能即可。
Mysql:设置主键⾃动增长起始值⽐较郁闷昨天在家使⽤‘alter table `tablename` AUTO_INCREMENT=10000;’怎么也不起效,但是今天下班时间公司⼀同事尝试了⼀下就可以了。
搞不明⽩⾃⼰当时是怎么操作的,导致最终不起效。
实现⽬标:mysql下将⾃增主键的值,从10000开始,即实现⾃增主键的种⼦为10000。
⽅案1)使⽤alter table `tablename` AUTO_INCREMENT=10000创建⾃增主键之后,使⽤alter table `tablename` AUTO_INCREMENT=10000实现修改表起始值。
drop table if exists `trace_test`;CREATE TABLE `trace_test` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;alter table `trace_test` AUTO_INCREMENT=10000;insert into `trace_test`(`name`)values('name2');select*from `trace_test`;Result:id name10000 name2⽅案2)创建表时设置AUTO_INCREMENT 10000参数drop table if exists `trace_test`;CREATE TABLE `trace_test` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT 10000DEFAULT CHARSET=utf8 ;insert into `trace_test`(`name`)values('name2');select*from `trace_test`;Result:id name10000 name23)如果表已有数据,truncate 之后设置auto_increment=10000,可⾏。
MySQL中的主键以及设置其⾃增的⽤法教程1、声明主键的⽅法:您可以在创建表的时候就为表加上主键,如:CREATE TABLE tbl_name ([字段描述省略...], PRIMARY KEY(index_col_name));也可以更新表结构时为表加上主键,如:ALTER TABLE tbl_name ADD PRIMARY KEY (index_col_name,…);/*创建⼀个qq表,将qq_id设为主键,且没有对其进⾏NOT NULl约束*/create table qq(qq_id int(10),nick_name varchar(255) not null,primary key (qq_id))/*插⼊⼀条数据,将qq号设为10000(咱也幻想⼀下),昵称设为"simaopig"*/INSERT INTO qq( qq_id, nick_name )VALUES ('10000', 'simaopig');主键被认为是NOT NULL和UNIQUE约束最好的结合。
如果这些列没有被明确地定义为NOT NULL,MySQL会隐含地定义这些列。
2、主键也是索引:刚才已经说了,主键其实也是索引,甚⾄在MySQL的术语⾥⾯“键”就等于“索引”,所以“外键”⼀定要先设为“索引”。
所以主键也应该和索引⼀样,既可以作⽤于单独的字段,⼜可以作⽤于多个字段。
举个简的例⼦吧,我住3单元,501室,我叫⼩⼩⼦,那么只有3单元501室才能在本⼩区表⾥⾯唯⼀确定我家。
因为2单元,501室住着的可能也是个⼩⼩⼦,所以只有两个字段才能唯⼀确定我,也就是说可以⼆者组合作为主键。
组合的主键,每个列都会隐含定义NOT NULL约束,且其⼆者加在⼀起被定义了UNIQUE 惟⼀约束。
/*创建防⽕墙表,将host 和port组合设为主键,注意我没有将port设NOT NULL约束*/create table firewall(host varchar(11) not null,port smallint(4),access enum('deny', 'allow') not null,primary key (host,port))/*插⼊⼀条新的记录,没有啥问题1 row(s) inserted.*/INSERT INTO firewall (host ,port ,access)VALUES ('202.65.3.87', '21', 'deny');3、设置主键⾃增下⾯我们通过⼀个实例来讲解设置主键⾃增的⽅法:⾸先创建数据库,创建表mysql> create database ssh2;Query OK, 1 row affected (0.04 sec)mysql> use ssh2;Database changedmysql> create table user(-> id integer primary key,-> firstname varchar(200) not null,-> lastname varchar(200) not null,-> age integer-> );Query OK, 0 rows affected (0.46 sec)给主键增加⼀个⾃增的功能:mysql> alter table user modify id integer auto_increment ;Query OK, 1 row affected (0.28 sec)Records: 1 Duplicates: 0 Warnings: 0这样,上⾯的user表⾥⾯的主键,id可以⾃增了。
MySQL技术使用数据库主键自增与非自增数据库是现代软件系统的重要组成部分,可以说没有数据库就没有现代化的软件应用。
而在数据库设计中,主键是非常重要的概念之一。
MySQL作为一个流行的关系型数据库管理系统,提供了多种方式来定义主键,其中包括主键的自增和非自增两种方式。
本文将探讨这两种方式的特点和使用场景。
一、主键的概念和作用主键是用于唯一标识数据库表中记录的一列或者一组列。
它的作用是确保每一行记录都能够被唯一地识别和访问。
主键可以用来建立表之间的关系,例如用作外键,从而实现表之间的连接和关联操作。
另外,主键还可以用来提高数据库的性能,例如通过B树索引的方式来快速查找和排序记录。
二、主键的自增方式主键自增是指主键的值是自动递增的。
在MySQL中,主键自增的实现是通过使用自增(AUTO_INCREMENT)属性来定义主键列。
当插入一行记录时,如果没有指定主键的值,系统会自动为其分配一个新的值,该值比之前插入的最大主键值大1。
主键自增的优点是能够确保主键的唯一性,避免了用户手工输入主键值时可能出现的错误。
此外,使用主键自增还可以简化数据库的管理,因为系统会自动为每一行记录分配主键值,减少了手动处理主键列的工作量。
但是,主键自增也有一些限制。
首先,主键自增只适用于整数类型的主键列,无法适应其他类型的主键需求。
其次,主键自增可能会导致主键列的值出现“跳跃”,即出现断层的情况。
例如,当插入一行记录后,又删除了该行记录,再次插入时,主键值可能会比之前插入的最大主键值大很多。
这是因为主键自增的值是根据表中已存在的最大主键值来确定的,而不是根据表中实际存在的记录数来确定的。
三、主键的非自增方式主键的非自增指的是主键的值是手工指定的。
在MySQL中,可以通过使用主键列的定义语句来定义非自增的主键,例如:```CREATE TABLE table_name (id INT PRIMARY KEY,...);```非自增的主键可以是任意类型,不局限于整数。
数据库主键的⾃动增长之总结 纠结了好久,不知道数据库主键该如何使⽤,进⾏数据库插⼊操作时,不知道怎么使处于主键的列⾃动进⾏增长,下⾯简单介绍⼀下,【SqlServer 2008数据库软件使⽤sql语句创建表的相关事项】主键的⾃动增长:⽅式⼀:设置“主键”的sql语句:primary key标识符:使得进⾏数据库表插⼊操作时,使主键⾃动增长,语句是:identity(1,1)1、使⽤sql语句进⾏创建表:create table student(id int identity(1,1) primary key,//主键的设置,还有主键的⾃动增长sid varchar(40) not null,sname varchar(30) not null)执⾏⼀下:创建表成功创建⾃动增长的主键表的具体⽅式:详见:然后进⾏插⼊操作:insert into student (id,sid,sname) values ('232','哈哈')//或者insert into student (id,sid,sname) values (1,'232','哈哈')//上⾯的两种插⼊语句都不可以,都会报错的,因为id是主键,不能为空;是标识符,不需要插⼊这列的数据,系统会⾃动的添加数据列的数据。
//所以,正确的写法是:insert into student (sid,sname) values('2020','gaga')得到的结果就是:⽅式⼆:项⽬中,每个表中都会有好多个字段名,为了使读效果增加,⼀般都会增加主键,然后主键⾃动增长(只是起到⼀个计数的作⽤⽽已),这就会省很⼤的事。
在设计表的时候就需要增加“主键”且还需要“标识列”,这样⼦在进⾏插⼊操作的时候就可以直接将其字段名省略掉;⽐如: 注意⼀:在编写sql语句时:其中flowId是主键,其他的都是普通的字段名 【sql语句中是没有flowId字段名的;】 insert into dbo.Hishop_OrderRetuenFlow (RetuId, OrderId, LinkMan, LinkTel) values (#retuid:VARCHAR#, #orderid:VARCHAR#, #linkman:VARCHAR#, #linktel:VARCHAR#) 注意⼆:在进⾏插⼊操作时,写url路径时,其中插⼊的字段的值,也不需要写主键的【易错点】 注意三:在进⾏前后台交互时,也不需要对此字段名进⾏命名或赋值什么的⽅式三:在创建不同类型的数据库,也会有不同的设置“主键、且主键⾃动增长”的⽅式: 如下 其中Mysql数据库创建主键且主键⾃动增长时,可以直接对字段设置;然⽽Oracle数据库则不⾏,需要使⽤sequence(序列),实现主键的⾃动增长;详细见:,{在oracle下触发器实现主键⾃增}。
MySQL教程45-MySQL主键⾃增长在 MySQL 中,当主键定义为⾃增长后,这个主键的值就不再需要⽤户输⼊数据了,⽽由数据库系统根据定义⾃动赋值。
每增加⼀条记录,主键会⾃动以相同的步长进⾏增长。
通过给字段添加 AUTO_INCREMENT 属性来实现主键⾃增长。
语法格式如下:字段名数据类型 AUTO_INCREMENT注意:默认情况下,AUTO_INCREMENT 的初始值是 1,每新增⼀条记录,字段值⾃动加 1。
⼀个表中只能有⼀个字段使⽤ AUTO_INCREMENT 约束,且该字段必须有唯⼀索引,以避免序号重复(即为主键或主键的⼀部分)。
AUTO_INCREMENT 约束的字段必须具备 NOT NULL 属性。
AUTO_INCREMENT 约束的字段只能是整数类型(TINYINT、SMALLINT、INT、BIGINT 等)。
AUTO_INCREMENT 约束字段的最⼤值受该字段的数据类型约束,如果达到上限,AUTO_INCREMENT 就会失效。
例 1定义数据表 student2,指定表中 id 字段递增,SQL 语句和运⾏结果如下:mysql>CREATE TABLE tb_student(-> id INT(4) PRIMARY KEY AUTO_INCREMENT,-> name VARCHAR(25) NOT NULL-> );Query OK, 0 rows affected (0.07 sec)其中,id 为主键,每插⼊⼀条新记录,id 的值就会在前⼀条记录的基础上⾃动加 1。
name 为⾮空字段,该字段的值不能为空值(NULL)。
向 student2 表中插⼊数据,SQL 语句如下所⽰:INSERT INTO tb_student(name) VALUES ('Java'), ('MySQL');语句执⾏完后,student2 表中增加了 2 条记录,在这⾥并没有输⼊ id 的值,但系统已经⾃动添加该值,使⽤ SELECT 命令查看记录,如下所⽰。
MySQL数据库8(九)列属性之主键、⾃增长主键顾名思义,主要的键,primary key,在⼀张表中,有且只有⼀个字段,⾥⾯的值具有唯⼀性创建主键随表创建系统提供了两种增加主键的⽅式:1、直接在需要当做主键的字段之后,增加primary key属性来确定主键2、在所有字段之后增加primary key选项:primary key(字段信息)表后增加基本语法:alter table 表名 add primary key(字段);查看主键⽅案1:查看表结构⽅案2:查看表的创建语句删除主键基本语法:alter table 表名 drop primary key;复合主键主键约束主键⼀旦增加,那么对对应的字段数据有要求:1、当前字段对应的数据不能为空。
2、当前字段对应的数据不能有任何重复主键分类主键分类采⽤的是主键所对应的字段的业务意义分类:业务主键:主键所在的字段,具有业务意义(学⽣ID,课程ID)逻辑主键:⾃然增长的整型(应⽤⼴泛)⾃增长⾃动增长:auto increment,当给定某个字段的属性之后,该列的数据在没有提供确定数据的时候,系统会根据之前已经存在的数据进⾏⾃动增加后,填充数据通常⾃动增长⽤于逻辑主键原理⾃动增长的原理:1、在系统中有维护⼀组数据,⽤来保存当前使⽤了⾃动增长属性的字段,记住当前对应的数据值,在给定⼀个指定的步长。
2、当⽤户进⾏数据插⼊的时候,如果没有给定值,系统在原始值上加上步长变成新的数据3、⾃动增长的触发:给定属性的字段没有提供值4、⾃动增长只适⽤于数值使⽤⾃动增长基本语法:在字段之后增加⼀个属性 auto_increment;插⼊数据:触发⾃动增长,不能给定具体值(可以给null)修改⾃动增长1、查看⾃增长:⾃增长⼀旦触发使⽤后,会⾃动地在表选项中增加⼀个选项(⼀张表最多只能拥有⼀个⾃增长)2、表选项可以通过修改表结构来实现基本语法:alter table 表名 auto_increment = 值;删除和增加⾃动增长删除⾃增长:就是在字段属性之后不再保留auto_increment,当⽤户修改⾃增长所在字段时,如果没有看到auto_increment属性,系统会⾃动清除该⾃增长。
Mysql、SqlServer、Oracle主键自动增长的设置
1、把主键定义为自动增长标识符类型
在mysql中,如果把表的主键设为auto_increment类型,数据库就会自动为主键赋值。
例如:
create table customers(id int auto_increment primary key not null, name
varchar(15));
insert into customers(name) values("name1"),("name2");
2、在MS SQLServer中,如果把表的主键设为identity类型,数据库就会自动为主键赋值。
例如:
create table customers(id int identity(1,1) primary key not null, name varchar(15)); insert into customers(name) values("name1"),("name2");
identity包含两个参数,第一个参数表示起始值,第二个参数表示增量。
3、Oracle列中获取自动增长的标识符
在Oracle中,可以为每张表的主键创建一个单独的序列,然后从这个序列中获取自动增加的标识符,把它赋值给主键。
例如一下语句创建了一个名为customer_id_seq的序列,这个序列的起始值为1,增量为2。
方法一、
create sequence customer_id_seq
INCREMENT BY 1 -- 每次加几个
START WITH 1 -- 从1开始计数
NOMAXVALUE -- 不设置最大值
NOCYCLE -- 一直累加,不循环
CACHE 10;
一旦定义了customer_id_seq序列,就可以访问序列的curval和nextval属性。
curval:返回序列的当前值
nextval:先增加序列的值,然后返回序列值
create table customers(id int primary key not null, name varchar(15));
insert into customers values(customer_id_seq.curval,
"name1"),(customer_id_seq.nextval, "name2");
方法二、或者通过存储过程和触发器:
1、通过添加存储过程生成序列及触发器:
create or replace PROCEDURE "PR_CREATEIDENTITYCOLUMN"
(tablename varchar2,columnname varchar2)
as
strsql varchar2(1000);
begin
strsql := 'create sequence seq_'||tablename||' minvalue 1 maxvalue 999999999999999999 start with 1 increment by 1 nocache';
execute immediate strsql;
strsql := 'create or replace trigger trg_'||tablename||' before insert on '||tablename||' for each row begin select seq_'||tablename||'.nextval
into :new.'||columnname||' from dual; end;';
execute immediate strsql;
end;
2、对表进行执行存储过程
exec PR_CREATEIDENTITYColumn('XS_AUDIT_RECORD','AUDIT_RECORD_ID');
上一种方案对每一张表都要进行,下面根据用户批量生成
select a.table_name, b.column_name from dba_constraints a, dba_cons_columns b where a.constraint_name = b.constraint_name
and a.CONSTRAINT_TYPE = 'P'
and a.owner=user;
3、添加执行存储过程的role权限,修改存储过程,加入Authid Current_User 时存储过程可以使用role权限。
create or replace procedure p_create_table
Authid Current_User is
begin
Execute Immediate 'create table create_table(id int)';
end p_create_table;。