如何在MYSQL插数据 ID自增

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在MYSQL插数据 ID自增相关的知识,希望对你有一定的参考价值。

一个insert方法

PreparedStatement ps;
String sql="insert message (id,name,msg) value(?,?,?)"

ps.setString(1,); --------------ID
ps.setString(2,name);
ps.setString(3,msg);

该怎样写能让ID字段 自增?
===========================================
没比的意思,不过请务必测试过了再回答
这问吧并不怎么好。。。

关于mysql自带的自蹭问题
我不要这个功能

有3条数据 编号1 2 3

我清空在插 就是4起步了

如何在MYSQL插数据ID自增的方法。

如下参考:

1.在添加字段之前,第一个应该首先检查当前tb1表的结构,如下图所示。

2.实例字段列添加到表,如下所示。

3.再次看表结构和比较之前和之后的情况添加字段,如下图所示。

4.最后,插入新的数据行看到的样子,最后添加自动增长的字段,如下所示。

注意事项:

MySQL使用的SQL语言是访问数据库最常用的标准语言。MySQL软件采用双重许可政策,分为社区版,商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特性,一般中小网站开发选择MySQL作为数据库。

参考技术A 2种解决办法

1.修改你的数据库表,将ID设为自增长,注:只有主键才可以设置为自增长
例:CREATE TABLE `message ` (`id` INT(8) NOT NULL AUTO_INCREMENT, PRIMARY KEY(`id`));

2.代码中进行处理
Statement ps;
ResultSet rs;
int id = 0;
..................
String sql="select max(id) as id from message";
rs = ps.executeQuery(sql);//查询出最大ID
if(rs.next)//如果有ID,原有ID+1
id = rs.getInt("id")+1;
else//否则 ID 初始为0
id = 0;

//下面接你写的代码就OK了
PreparedStatement ps;
String sql="insert message (id,name,msg) value(?,?,?)"

ps.setString(1,id);
ps.setString(2,name);
ps.setString(3,msg);本回答被提问者采纳
参考技术B 列的自增属性,一般用来设置整数列根据一定步长逐步增长的值,类似于其他数据库的序列。不过这里的“序列”是基于特定一张表的。关于自增属性的相关特性如下:
1. 控制自增属性性能的变量:innodb_autoinc_lock_mode
innodb_autoinc_lock_mode=0
代表传统模式,也就是说,在对有自增属性的字段插入记录时,会持续持有一个表级别的自增锁,直到语句执行结束为止。比如说下面两条语句,SQL 1 在执行期间,一直持有对表 f1 的表级自增锁,接下来 SQL 2 执行时锁超时。
innodb_autoinc_lock_mode=1
代表连续模式,和传统模式差不多,不同的点在于对于简单的插入语句,比如 SQL 2,只在分配新的 ID 过程中持有一个轻量级的互斥锁(线程级别,而不是事务级别),而不是直到语句结束才释放的表锁。
代表交错模式。这个模式下放弃了自增表锁,产生的值会不连续。不过这是性能最高的模式,多条插入语句可以并发执行。MySQL 8.0 默认就是交错模式。
那针对复制安全来说,以上三种模式,0 和 1 对语句级别安全,也就是产生的二进制日志复制到任何其他机器都数据都一致;2 对于语句级别不安全;三种模式对二进制日志格式为行的都安全。
2. 控制自增属性的步长以及偏移量
一般用在主主复制架构或者多源复制架构里,主动规避主键冲突。
auto_increment_increment 控制步长
auto_increment_offset 控制偏移量
3. 对于要立刻获取插入值的需求
就是说要获取一张表任何时候的最大值,应该时刻执行以下 SQL 3 ,而不是 SQL 2。SQL 2 里的函数 last_insert_id() 只获取上一条语句最开始的 ID,只适合简单的 INSERT。
4. 自增列溢出现象
自增属性的列如果到了此列数据类型的最大值,会发生值溢出。比如变更表 f1 的自增属性列为 tinyint。
SQL 2 显式插入最大值 127, SQL 3 就报错了。所以这点上建议提前规划好自增列的字段类型,提前了解上限值。
5. 自增列也可以显式插入有符号的值
那针对这样的,建议在请求到达数据库前规避掉。
参考技术C MySql中提供了自增,你可以修改你的表结构,要么干脆新建一个表create table test(id int AUTO_INCREMENT)

然后插入数据库的时候就不要管这个字段了,如下:
insert message(name,msg) values(?,?);
参考技术D PreparedStatement ps;
String sql="insert message (id,name,msg) value(?,?,?)"

ps.setString(2,name);
ps.setString(3,msg);

主键的数据不用赋值,数据库会自动给你一个值的。

mysql如何设置ID自增

参考技术A

设置自增列

MYSQL的自增列一定要是有索引的列,设置种子值要在表的后面设置

--mysql

-- 设置自增ID从N开始

CREATE TABLE empautoinc(

ID INT PRIMARY KEY AUTO_INCREMENT

) AUTO_INCREMENT = 100 ; --(设置自增ID从100开始)

insert into empautoinc(id) values(null);

Query OK, 1 row affected (0.00 sec)

mysql> select * from empautoinc;

+-----+

| ID |

+-----+

| 100 |

+-----+

1 row in set (0.00 sec)


show table status like \'empautoinc\'G;

*************************** 1. row ***************************

Name: empautoinc

Engine: InnoDB

Version: 10

Row_format: Compact

Rows: 1

Avg_row_length: 16384

Data_length: 16384

Max_data_length: 0

Index_length: 0

Data_free: 0

Auto_increment: 101

Create_time: 2016-10-27 01:50:32

Update_time: NULL

Check_time: NULL

Collation: utf8_general_ci

Checksum: NULL

Create_options:

Comment:

1 row in set (0.00 sec)

设置自增列的步长,可以分为全局级别和会话级别

如果是会话级别,那么当用户新建一个会话的时候,那么步长又回到了全局级别,所以mysql的步长跟sqlserver的步长有很大的不同

mysql不能设置为 表级别 的步长

私信666领取资料

以上是关于如何在MYSQL插数据 ID自增的主要内容,如果未能解决你的问题,请参考以下文章

MySQL中如何获取下一条插入的自增ID

Mysql 如何在指定ID后添加数据,比如我想把新数据插在id为1的数据后面

sql的自增列如何重置

关于hibernate+mysql的ID自增如何添加数据

mysql清空表数据后如何让自增ID仍从1开始

mysql的一个id设置为自动增加后,如何插入数据