mysql 自增插入
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql 自增插入相关的知识,希望对你有一定的参考价值。
connect=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test","root","admin");
ps=connect.prepareStatement("select max(id) as id from users");
rs = ps.executeQuery();
if(rs.next())
id = rs.getInt("id")+1;
else
id = 0;
String sql1="insert into users values (,?,?,?,?,?,?,?,?)";
// ps.setInt(1, id);
ps.setString(2,bm);
ps.setString(3,szd);
ps.setString(4,zrr);
ps.setString(5,ip);
ps.setString(6,zid);
ps.setString(7,xid);
ps.setString(8,yid);
ps.setString(9,mac);
No parameters defined during prepareCall();没有定义 ps.setString(2,bm)等,怎么解决 在哪里定义
这是我的表结构
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. 自增列也可以显式插入有符号的值
那针对这样的,建议在请求到达数据库前规避掉。 参考技术A 想你这种情况,数据库中已经定义自增了,那么代码里就不需要处理这个字段了。
if(rs.next())
id = rs.getInt("id")+1;
else
id = 0;
这段代码可以不用了。
另外,
String sql1="insert into users values (,?,?,?,?,?,?,?,?)";
// ps.setInt(1, id);
ps.setString(2,bm);
这部分,也不需要写那么多参数了。
改成:
String sql1="insert into users values (?,?,?,?,?,?,?,?)";
ps.setString(2,bm);
……
试试吧 参考技术B
1-首先你的主键已经是auto_increment了,那么以下代码就可以去掉了
ps=connect.prepareStatement("select max(id) as id from users");rs = ps.executeQuery();
if(rs.next())
id = rs.getInt("id")+1;
else
id = 0;
2-你可以这么写
//或者
//String sql1 = "insert into users values(null,?,?,?,?,?,?,?,?)";
ps.setString(1,bm);//从1开始
ps.setString(2,szd);
ps.setString(3,zrr);
ps.setString(4,ip);
ps.setString(5,zid);
ps.setString(6,xid);
ps.setString(7,yid);
ps.setString(8,mac);
//在这里执行你的sql语句即可 参考技术C 首先括号里需要再多一个?,把//去掉然后把这个“?”放在那个逗号前。或者把里面最前面那个逗号去掉。看看你数据库几个字段,每个字段都是什么属性,这就是插入一条数据多个字段而已- -。没什么自增的。你应该是想把这些名字都插入进不同数据吧?用循环语句吧追问
java.sql.SQLException: No parameters defined during prepareCall()
不行 还是同样的问题
MySQL插入自增列数据的问题
我有一个表StuInfo,里面只有两列 StuID,StuName其中StuID是int型,主键,自增列。现在我要插入数据,让他自动的向上增长,insert into StuInfo(StuID,StuName) values(????) 如何写?
INSERT INTO StuInfo(StuID,StuName) VALUES (NULL, `字符`)或者INSERT INTO StuInfo(StuName) VALUES (`字符`) 参考技术A 自动增长列是不能为其赋值的,您只需把不是自动增长列赋值就可以了
insert into StuInfo(StuName) values('张三')
以上,希望对你有所帮助! 参考技术B 直接 values(NULL ,$name) 就OK了 不行加我 574121312
以上是关于mysql 自增插入的主要内容,如果未能解决你的问题,请参考以下文章