数据库如何设置主键(ID)自动增长啊(SQL语句)?

数据库如何设置主键(ID)自动增长啊(SQL语句)?,第1张

在创建表的时候可以设置,方法如下,用一下sql语句

create table tableName(

id int identity(1,1) primary key,

data varchar(50))

解释:其中identity(1,1)代表自增,第一个1代表从1开始计数,第二个1代表每次增长1。

扩展资料:

SQL 全名是结构化查询语言[1](Structured Query Language),是用于数据库中的标准数据查询语言,IBM 公司最早使用在其开发的数据库系统中。1986年10月,美国国家标准学会(ANSI) 对 SQL 进行规范后,以此作为关系式数据库管理系统的标准语言 (ANSI X3. 135-1986),1987年得到国际标准组织的支持下成为国际标准。不过各种通行的数据库系统在其实践过程中都对 SQL 规范作了某些编改和扩充。所以,实际上不同数据库系统之间的SQL不能完全相互通用。

参考资料:

百科-SQL语言

2种办法

1.修改你的数据库表,将ID设为自增长,注:只有主键才可以设置为自增长

id自增是由mysql负责的,设置id AUTO_INCREMENT 插入时不用插入id值就能实现自增CREATE TABLE `table ` (`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)

列的自增属性,一般用来设置整数列根据一定步长逐步增长的值,类似于其他数据库的序列。不过这里的“序列”是基于特定一张表的。关于自增属性的相关特性如下:

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. 自增列也可以显式插入有符号的值

那针对这样的,建议在请求到达数据库前规避掉。


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存