数据库自增长主键
‘壹’ 关于如何获得数据库插入操作中数据的自增长主键的值
有时在做数据插入操作时需要获得刚刚插入数据的主键值,由于主键是自增长,并且可能存在并发的情况,所以不能使用数据库最后一条记录来确定。
当然如果使用hibernate的话hibernate会主动帮你获得主键,但项目可能碰到这样的需求插入就使用hibernate来处理。从网上搜索了很多解决方案,并在查看了MYsql的文档后找到了在MYSQL中的解决方案。
在MYSQL中可以使用select @@identity;来查询最后一条插入自增长的键值,select @@identity;查询的是当前作用域的自增长键值,也就是当前Connection的,所以在同一个Connection操作下可以在插入一条记录后在执行select @@identity;查询出该条记录的主键。在MSSQL中好像也可以这样查询,就是不知道查询出来的作用域是否是当前会话的作用域,如果是的话MSSQL也就能采用同样的方法实现了。
附上一个基本的查询代码:
‘贰’ mysql数据库主键设置了自增,但是,我把删除了一些数据,随后加的数据为什么会自增ID会接着已经删除了的
这是数据库主键自增的固然性质所决定的,数据删除后,主键还是会继续增加的,即主键使用过一次将不会再次使用。
例如:这个表中有10条数据,主键为1-10不间断的数字,那删除第十条数据,继续插入的话,id则会变成11,而不是10。通俗的说就是主键使用过一次将不会再次使用。
每次插入则不需要为主键设置参数,数据库会根据设置的递增条件,自动给出主键值。则第一次插入后主键为1,第二次为2,依次递增。
(2)数据库自增长主键扩展阅读:
Mysql、SqlServer主键自动增长的设置方法:
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包含两个参数,第一个参数表示起始值,第二个参数表示增量。
‘叁’ 如何获得mysql数据库 自增长主键的值
如果是自增长的话,直接用max函数即可。
如表为:
id
name
1
张三
2
李四
3
王五
其中id为自增长字段,如果要查询目前主键的值,可用如下语句:
select max(id) as id from 表名;结果显示为:
id
3
就说明目前id的值为3。
‘肆’ mysql数据库怎么让id自动增长,但ID不是主键。难道只有ID为主键时,才可以自增的么
从零蛋娃娃的回复中得到启示,解决问题。
重新表述需求: id自增长,同时需要一个键uniquekey是唯一键。
解决方法就是:
把id在索引中设置索引类型为任意一个类型,比如normal,然后unique就可以设置为主键了。
或者反过来,id自增长,同时作为主键。 uniquekey在索引中索引类型设置为unique即可。
补充:考虑到主键能设置成外键,所以建议用以上第一种方式。
‘伍’ 数据库中的主键如何设置为自动增长
数据表上右键=》设计=》选中主键字段=》下面有属性窗口
=》标识规范=》选是,注意主键字段必须是整形的
‘陆’ MySQL 数据库中只有主键能自动增长么
不一定的,MySQL 每张表只能有1个自动增长字段,这个自动增长字段即可作为主键,也可以用作非主键使用,但是请注意将自动增长字段当做非主键使用时必须必须为其添加唯一索引,否则系统将会报错。例如:
1.将自动增长字段设置为主键。
create table t1 (id int auto_increment Primary key,sid int);
2.将自动增长字段设置为非主键,注意必须显式添加Unique键。
create table t2 (sid int primary key,id int auto_increment Unique);
3.将自动增长字段设置为非主键如果未添加唯一索引将会报错**,如下面语句
create table t3 (sid int primary key,id int auto_increment)。
‘柒’ 如何获得mysql数据库自增长主键的值
this.employee_id = employee_id;}} 其它几个属性的getter和setter省略,这里我们要用到ejb3-persistence.jar,JPA的注解类就在这个包中,下面详细说明上面使用到的注解。 @Entity:通过@Entity注解将一个类声明为一个实体bean @Table:通过 @Table注解可以为实体bean映射指定表,name属性表示实体所对应表的名称,如果没有定义 @Table,那么系统自动使用默认值:实体的类名(不带包名) @Id:用于标记属性的主键 @Column:表示持久化属性所映射表中的字段,如果属性名与表中的字段名相同,则可以省略@Column注解,另外有两种方式标记,一是放在属性前,另一种是放在getter方法前,例如: @Column(name = EMPLOYEE_NAME) private String employee_name; 或者 @Column(name = EMPLOYEE_NAME) public String getEmployee_name() { return employee_name; } 这两种方式都是正解的,根据个人喜好来选择。大象偏向于第二种,并且喜欢将属性名与字段名设成一样的,这样可以省掉@Column注解,使代码更简洁。 @TableGenerator:表生成器,将当前主键的值单独保存到一个数据库表中,主键的值每次都是从指定的表中查询来获得,这种生成主键的方式是很常用的。这种方法生成主键的策略可以适用于任何数据库,不必担心不同数据库不兼容造成的问题。大象推荐这种方式管理主键,很方便,集中式管理表的主键,而且更换数据库不会造成很大的问题。各属性含义如下: name:表示该表主键生成策略的名称,这个名字可以自定义,它被引用在@GeneratedValue中设置的generator值中 table:表示表生成策略所持久化的表名,说简单点就是一个管理其它表主键的表,本例中,这个表名为GENERATOR_TABLE pkColumnName:表生成器中的列名,用来存放其它表的主键键名,这个列名是与表中的字段对应的 pkColumnValue:实体表所对应到生成器表中的主键名,这个键名是可以自定义滴 valueColumnName:表生成器中的列名,实体表主键的下一个值,假设EMPLOYEE表中的EMPLOYEE_ID最大为2,那么此时,生成器表中与实体表主键对应的键名值则为3 allocationSize:表示每次主键值增加的大小,例如设置成1,则表示每次创建新记录后自动加1,默认为50@GeneratedValue:定义主键生成策略,这里因为使用的是TableGenerator,所以,主键的生成策略为GenerationType.TABLE,生成主键策略的名称则为前面定义的”tab-store”。 这里大象想说下,网上有很多文章写的是strategy = GenerationType.AUTO或是strategy = GenerationType.SEQUENCE,采用SEQUENCE序列是因为Oracle数据中不支持identity自动增长,要想使用它,还得在数据库中创建一个序列,如果要更换数据库,那将是一个非常麻烦的事情。SEQUENCE生成方式我们暂且不谈,这里说下采用AUTO和IDENTITY的生成方式,本例采用的是SQL Server 2000作为数据库,所以如果想使用AUTO或是IDENTITY生成策略,则一定要对主键加上identity标识,如identity(1,1)。不过对于AUTO来说,是根据不同的数据库选择最合适的自增主键生成策略。如果使用MySQL,则主键要定义AUTO_INCREMENT,如果是Oracle,则要创建Sequence来实现自增。不管采用何种生成策略,增、删、改这些方法中一定要加入事务,否则数据是不会添加到数据库中滴~~~这是大象反复测试过的结果!
‘捌’ 如何设置mysql 主键自动增长
如果你数据库已经建立 用这个方法:
ALTER TABLE `test` CHANGE `id` `id` INT(11) NOT NULL AUTO_INCREMENT;
如果你数据库没有建立 就用CREATE :
如果你用的数据库软件 比如Navicat for MySQL。 那么在设计表选项里有设置自动增长的,打上勾
‘玖’ 数据库设置主键的时候用,为什么设置自动增长
保证程序的正确性,主键ID首先具有唯一性,设置自动增长在前台Insert的时候不需要传入ID的值,数据库自动根据最后一个ID值增加1
保证数据库主键不重复而且调用更为高效。
假如说没有设置自动增长
在insert一条记录的时候需要人为传递ID值。要保证唯一性必须要先获得上条记录的ID用select
然后再加一
然后在执行insert
从效率方面降低程序的灵活性。
个人见解。