mySQL中如何修改列为自动增长急!!!

mySQL中如何修改列为自动增长急!!!,第1张

alter table questionlib modify id int(11) auto_increment;

注意事项:

修改后从下一条记录开始自动增长。如果想让原来的自动增长就得复制现有表的结构(无id),添加id并加上AUTO_INCREMENT,然后通过循环,添加n条空记录,然后对应先前表的id,依次插入数据。

扩展资料:

mysql自动增长开始值设置总结

1、创建表,设置表主键id自动增长,默认自动增长的起始值为1开始。

2、当表数据不为空的时候,重新去修改自动增长id开始值,mysql会主动去核对你设置的起始值是否是当前数据库已有id的最大值+1; 若是则修改成功,若不是则修改不成功 (默认还是id最大值+1)

3、要设置自动增长为1开始,需要清空表数据才行。alter table table_name AUTO_INCREMENT=1

4、若每次直接在数据库里面插入数据,则会自动的去修改当前表的自动增长起始值(设置自动增长起始值为当前插入成功的数据的id)

您好,increment:代理主键,适合于所有数据库,由hibernate维护主键自增,和底层数据库无关,但是不适合于2个或以上hibernate进程。

identity:代理主键,适合于mysql或ms

sql

server等支持自增的dbms,主键值不由hibernate维护。

sequence:代理主键,适合于oracle等支持序列的dbms,主键值不由hibernate维护,由序列产生。

native:代理主键,根据底层数据库的具体特性选择适合的主键生成策略,如果是mysql或sqlserver,选择identity,如果是oracle,选择sequence。

hilo:代理主键,hibernate把特定表的字段作为hign值,生成主键值

uuidhex:代理主键,hibernate采用uuid

128位算法生成基于字符串的主键值

assign:适合于应用程序维护的自然主键。

想要实现安全的自增只能使用hibernate维护得自增属性identity,或者使用开发者自己维护id值assign。如果使用identify,经过测试发现使用无论开发者是否给对象的id赋值,hibernate在保存对象时会自动给id赋值(为mysql表中id最大值+1);如果使用assign,用户在保存对象前必须给对象的id赋值,值必须大于等于0,如果等于0时,那么数据表id记录会使用mysql数据库维护的最大id+1,如果大于0时,则表id则为用户设置的对象的id值。

经过实验得出,想要实现mysql的sql语句句式以及最终效果,需要设置hibernate配置文件的id自增属性为assign,如果知道id的话则设置对象的id为已知的id,否则设置id的值为0,。

如果id自增属性为assign,那么hibernate保存对象后,对象的id仍然为保存前设置的值;

如果id自增属性为identity,那么hibernate保存对象后,对象的id为数据库中该条记录的id的值。

你好!

MySql中提供了自增,你可以修改你的表结构,要么干脆新建一个表create

table

test(id

int

AUTO_INCREMENT)

然后插入数据库的时候就不要管这个字段了,如下:

insert

message(name,msg)

values(,);

如有疑问,请追问。

mybatis自增主键配置:

mybatis进行插入 *** 作时,如果表的主键是自增的,针对不同的数据库相应的 *** 作也不同。基本上经常会遇到的就是 Oracle Sequece 和 Mysql 自增主键。主要说明下在mybatis中对于自增主键的配置。

1、不返回自增主键值:

如果考虑到插入数据的主键不作为其他表插入数据的外键使用,可以考虑这种方式。

Oracle Sequence 配置

<sql id='TABLE_NAME'>TEST_USER</sql>

<sql id='TABLE_SEQUENCE'>SEQ_TEST_USER_IDnextval</sql>

 <!-- 注意这里直接调用sequence的nextval函数 -->

 <insert id="insert" parameterType="User">

     insert into <include refid="TABLE_NAME" /> (ID,NAME,AGE)

         values ( <include refid="TABLE_SEQUENCE" /> ,#{name}, #{age} )

 </insert>

当插入语句如上配置时,那么针对如下语句

User user = new User();

 usersetName("test");

 usersetAge(24);

 userMapperinsert(user);

 Systemoutprintln(userid); // userid 为空

userid为空,也就是说如上的配置并不能在完成插入 *** 作后将插入时的主键值存放到保存的对象中。

2、Mysql自增主键配置

由于mysql数据库中,可以设置表的主键为自增,所以对于Mysql数据库在mybatis配置插入语句时,不指定插入ID字段即可。主键的自增交由Mysql来管理。

<sql id='TABLE_NAME'>TEST_USER</sql>

 

<!-- 注意这里的插入SQL中是没有指明ID字段的! -->

<insert id="insert" parameterType="User">

    insert into <include refid="TABLE_NAME" /> (NAME,AGE)

        values (#{name}, #{age} )

</insert>

同样,针对Mysql如此配置mybaits,插入完成后userid为空。

插入后获取自增主键值:

上述的情况能满足大部分情况,但有时候我们会遇到类似一对多的那种表结构,在插入多端数据时,需要获取刚刚保存了的一段的主键。那么这个时候,上述的配置就无法满足需要了。为此我们需要使用mybatis提供的<selectKey />来单独配置针对自增逐渐的处理。

1、Oracle Sequence 配置:

<sql id='TABLE_NAME'>TEST_USER</sql>

 <sql id='TABLE_SEQUENCE'>SEQ_TEST_USER_IDnextval</sql>

 <!-- 注意这里需要先查询自增主键值 -->

 <insert id="insert" parameterType="User">

     <selectKey keyProperty="id" resultType="int" order="BEFORE">

         select <include refid="TABLE_SEQUENCE" /> from dual

     </selectKey>

     insert into <include refid="TABLE_NAME" /> (ID,NAME,AGE)

         values ( #{id}, #{name}, #{age} )

 </insert>

当使用了<selectKey />后,在实际的插入 *** 作时,mybatis会执行以下两句SQL:

select SEQ_TEST_USER_IDnextval from dual; // 语句1

 insert into (ID,NAME,AGE) values ( , ,  ); // 语句2

在执行插入 语句2 之前,会先执行 语句1 以获取当前的ID值,然后mybatis使用反射调用User对象的setId方法,将 语句1 查询出的值保存在User对象中,然后才执行 语句2 这样就保证了执行完插入后

User user = new User();

 usersetName("test");

 usersetAge(24);

 userMapperinsert(user);

 Systemoutprintln(userid); // userid 不为空

userid是有值的。

2、Mysql自增主键配置

针对于Mysql这种自己维护主键的数据库,可以直接使用以下配置在插入后获取插入主键,

<sql id='TABLE_NAME'>TEST_USER</sql>

 <insert id="insert" useGeneratedKeys="true" keyProperty="id" parameterType="User">

     insert into <include refid="TABLE_NAME" /> ( NAME, AGE )

         values ( #{name}, #{age} )

 </insert>

当然,由于Mysql的自增主键可以通过SQL语句

select LAST_INSERT_ID();

来获取的。因此针对Mysql,Mybatis也可配置如下:

<sql id='TABLE_NAME'>TEST_USER</sql>

 <!-- 注意这里需要先查询自增主键值 -->

 <insert id="insert" parameterType="User">

     <selectKey keyProperty="id" resultType="int" order="BEFORE">

         SELECT LAST_INSERT_ID()

     </selectKey>

     insert into <include refid="TABLE_NAME" /> (ID,NAME,AGE)

         values ( #{id}, #{name}, #{age} )

 </insert>

只不过该中配置需要额外的一条查询SQL

小结

当数据插入 *** 作不关心插入后数据的主键(唯一标识),那么建议使用 不返回自增主键值 的方式来配置插入语句,这样可以避免额外的SQL开销

当执行插入 *** 作后需要立即获取插入的自增主键值,比如一次 *** 作中保存一对多这种关系的数据,那么就要使用 插入后获取自增主键值 的方式配置

从零蛋娃娃的回复中得到启示,解决问题。

重新表述需求: id自增长,同时需要一个键uniquekey是唯一键。

解决方法就是:

把id在索引中设置索引类型为任意一个类型,比如normal,然后unique就可以设置为主键了。

或者反过来,id自增长,同时作为主键。 uniquekey在索引中索引类型设置为unique即可。

补充:考虑到主键能设置成外键,所以建议用以上第一种方式。

首先码却保你这张表中没有PRIMARY KEY,如果有先删除这张表中的 PRIMARY KEY,

然后创建一个自增长字段

语法如下:

ALTER TABLE `表名` ADD `字段名` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY

例如:

ALTER TABLE `custnew` ADD `cust_id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY

以上就是关于mySQL中如何修改列为自动增长急!!!全部的内容,包括:mySQL中如何修改列为自动增长急!!!、mysql数据库自己维护主键自增和hibernate维护主键自增、如何在MYSQL插数据 ID自增等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9367708.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存