insert语句id自增(如何获取自增id)

本文目录
- 如何获取自增id
- oracle序列已经创建了 现在我要插入的时候id为自动增长 ,insert的时候插入怎么写
- mysql id自增长的insert语句
- Mysql insert 自增 id 表,如何进行回滚语句生成
- 如何在已有数据的表中添加id字段并且自增
- sql server 2008中id如何设为自增
- mysql 执行insert返回自增长id
如何获取自增id
去"O"的业务支撑的时候,遇到一个开发询问如何获取到MySQL 的自增id,这里做一个总结,我们可以通过四种方式来获取MySQL 的自增id。
一 last_insert_id()
官方介绍如下:
“The ID that was generated is maintained in the server on a per-connection basis. This means that the value returned by the function to a given client is the first AUTO_INCREMENT value generated for most recent statement affecting an AUTO_INCREMENT column by that client. This value cannot be affected by other clients, even if they generate AUTO_INCREMENT values of their own. This behavior ensures that each client can retrieve its own ID without concern for the activity of other clients, and without the need for locks or transactions. ”
last_insert_id() 单个会话中最近一次执行的insert语句时表的自增id的值。不受其他的会话插入影响。
如果是新建的表,它的值为0
root@rac3 》 create table t2(id int not null auto_increment primary key ,col varchar(10));
Query OK, 0 rows affected (0.11 sec)
root@rac3 》 select last_insert_id();
+------------------+
| last_insert_id() |
+------------------+
| 0 |
+------------------+
1 row in set (0.01 sec)
如果向表中插入的记录,id自增,它的值为max(id),如果指定插入的id ,它的值为上一次插入的最大值。
root@rac3 》 insert into t3 values(null,’sss’);
Query OK, 1 row affected (0.00 sec)
root@rac3 》 select last_insert_id();
+------------------+
| last_insert_id() |
+------------------+
| 1 |
+------------------+
1 row in set (0.00 sec)
root@rac3 》 insert into t3 values(2,’sss’);
Query OK, 1 row affected (0.00 sec)
root@rac3 》 select last_insert_id();
+------------------+
| last_insert_id() |
+------------------+
| 1 |
+------------------+
1 row in set (0.00 sec)
使用select last_insert_id()时要注意,当一次插入多条记录时,只是获得第一次插入的id值,务必注意!
root@rac3 》 select last_insert_id();
+------------------+
| last_insert_id() |
+------------------+
| 3 |
+------------------+
1 row in set (0.01 sec)
root@rac3 》 insert into t1 values(null,’sss’),(null,’dd’),(null,’aaa’);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
root@rac3 》 select * from t1;
+----+------+
| id | col |
+----+------+
| 1 | sss |
| 2 | sss |
| 3 | sss |
| 4 | sss |
| 5 | dd |
| 6 | aaa |
+----+------+
6 rows in set (0.00 sec)
root@rac3 》 select last_insert_id();
+------------------+
| last_insert_id() |
+------------------+
| 4 |
+------------------+
1 row in set (0.00 sec)
last_insert_id 是与表无关的,如果向表a插入数据后,再向表b插入数据,last_insert_id 返回表b的Id值!
root@rac3 》 insert into t2 values(null,’sss’);
Query OK, 1 row affected (0.00 sec)
root@rac3 》 select last_insert_id();
+------------------+
| last_insert_id() |
+------------------+
| 11 |
+------------------+
1 row in set (0.00 sec)
root@rac3 》 insert into t1 values(null,’sss’);
Query OK, 1 row affected (0.00 sec)
root@rac3 》 select @@identity;
+------------+
| @@identity |
+------------+
| 3 |
+------------+
1 row in set (0.00 sec)
二 使用@@identity
@@identity是表示的是最近一次向具有identity属性(即自增列)的表插入数据时对应的自增列的值,是系统定义的全局变量。
其特性last_insert_id 一样.
三 使用max(id)
select max(id) from tab; 返回的是tab 的最大id值。
使用max(id) 只能针对单个表获取最大的id,而且高并发情况下,必须加上’X’ 锁才能获取会话当前的最大id,显然加锁会严重影响并发性能。
四 查看表结构
root@rac3 》 show table status like ’t3’ \G
*************************** 1. row ***************************
Name: t3
Engine: InnoDB
Version: 10
Row_format: Compact
Rows: 2
Avg_row_length: 8192
Data_length: 16384
Max_data_length: 0
Index_length: 0
Data_free: 0
Auto_increment: 3
Create_time: 2014-05-06 20:36:00
Update_time: NULL
Check_time: NULL
Collation: utf8_bin
Checksum: NULL
Create_options:
Comment:
1 row in set (0.00 sec)
root@rac3 》 show create table t3 \G
*************************** 1. row ***************************
Table: t3
Create Table: CREATE TABLE `t3` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`col` varchar(10) COLLATE utf8_bin DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_bin
1 row in set (0.00 sec)
五 总结
我们知道MySQL 使用auto_increment 属性来实现自增id,这点与oracle 的sequence 不同,auto_increment 是基于表的而非全局。从oracle 到mysql 的dba 要注意改变对sequence 使用方式的转变。
oracle序列已经创建了 现在我要插入的时候id为自动增长 ,insert的时候插入怎么写
SQL》 CREATE SEQUENCE test_sequence2
2 increment by 1 -- 每次递增1
3 start with 1 -- 从1开始
4 nomaxvalue -- 没有最大值
5 minvalue 1 -- 最小值=1
6 NOCYCLE; -- 不循环
Sequence created.
SQL》 CREATE TABLE test_create_tab2 (
2 id INT,
3 val VARCHAR(10),
4 PRIMARY KEY (id)
5 );
Table created.
SQL》 CREATE OR REPLACE TRIGGER BeforeTestCreate2Insert
2 BEFORE INSERT ON test_create_tab2
3 FOR EACH ROW
4 BEGIN
5 SELECT test_sequence2.nextval INTO :new.id FROM dual;
6 END;
7 /
Trigger created.
SQL》 INSERT INTO test_create_tab2(val) VALUES (’NO id’);
1 row created.
SQL》 INSERT INTO test_create_tab2(id, val) VALUES (1, ’id no use’);
1 row created.
SQL》 SELECT * FROM test_create_tab2;
ID VAL
---------- --------------------
1 NO id 2 id no use
mysql id自增长的insert语句
设置表的字段为auto_increment类型,然后再insert数据的时候,设置这个字段的value为null,这个字段就会自动维护,使用MySQL自己的自增值自动维护。
Mysql insert 自增 id 表,如何进行回滚语句生成
两个办法。
第一是你批量插入的数据要么全部成功,要么全部失败,不需要顾及部分成功的时候回滚存在所谓的误删。意思就是说(1,1),(2,2),(3,3) 三个插入,要不就都进去了,要不都不要进去;只要考虑直接rollback就行了;
第二个办法是你自己控制写入的主键值,维护一个主键的序列,每次插入之前先去序列里面申请一个值,即使并发的时候也要这么做,从机器角度来讲,真正在毫秒级别上的并发也能被识别出来;确保了每组写入的主键不同,失败的时候就知道到底是哪个主键对应的插入失败了。就是类似于使用oracle的sequence值来做主键。
如何在已有数据的表中添加id字段并且自增
在数据库中创建存储过程,比如存储过程的名字叫做 test在java中和正常使用sql的方法一样, sql = "call test(B1,B2)", B1和B2是假设你将要插入b表中的数据
假设b表的结构是(ID int auto_incremet, B1 int, B2 int)
假设a表的结构是(ID int)
CREATE test(B1 int, B2 int) #假设A1和A2是将要插入b表中的数据
BEGIN
declare new_id as int; #声明自增长所添加的ID
insert into b(B1,B2) values(B1,B2); #给b插入新的记录
select last_insert_id() into new_id; #取得新插入记录的ID
insert into a(ID) values(new_id); #把新插入的ID写入a表
select new_id; #如果需要的话存储过程返回新得到的ID给客户端
END
注意: 为什么推荐使用存储过程,而不是直接在java程序中使用select last_insert_id(); 因为这个函数是打开当前端口时,返回最后一个插入的自增长的ID, 如果不用存储过程,可能当前链接关闭,或有其他的应用也在其他有自增长ID的表中插入新的记录, 这时你取回的ID就是错误的。
sql server 2008中id如何设为自增
SQL Server
通过 IDENTITY 来设置
参数有2个,一个是“初始值” 一个是“增量”。
默认情况下 INSERT 语句中,不能对 IDENTITY 的字段进行赋值。
1》 CREATE TABLE test_create_tab2 (
2》 id INT IDENTITY(1, 1) PRIMARY KEY,
3》 val VARCHAR(10)
4》 );
5》 go
1》 INSERT INTO test_create_tab2(val) VALUES (’NO id’);
2》 go
(1 行受影响)
1》 INSERT INTO test_create_tab2(id, val) VALUES (6, ’id no use’);
2》 go
消息 544,级别 16,状态 1,服务器 HOME-BED592453C\SQLEXPRESS,第 1 行
当 IDENTITY_INSERT 设置为 OFF 时,不能为表 ’test_create_tab2’ 中的标识列插入显式值。
1》 INSERT INTO test_create_tab2(val) VALUES (’A’);
2》 INSERT INTO test_create_tab2(val) VALUES (’B’);
3》 INSERT INTO test_create_tab2(val) VALUES (’C’);
4》 INSERT INTO test_create_tab2(val) VALUES (’D’);
5》 go
1》 SELECT * FROM test_create_tab2;
2》 go
id val
----------- ----------
1 NO id
2 A
3 B
4 C
5 D
(5 行受影响)
-- 删除一个数据,造成数据不连续.
1》 DELETE FROM test_create_tab2 WHERE id = 3;
2》 go
(1 行受影响)
-- 允许将显式值插入表的标识列中
1》 SET IDENTITY_INSERT test_create_tab2 ON
2》 go
1》 INSERT INTO test_create_tab2(id, val) VALUES (3, ’id is use’);
2》 go
(1 行受影响)
--不允许将显式值插入表的标识列中
1》 SET IDENTITY_INSERT test_create_tab2 OFF
2》 go
1》 SELECT * FROM test_create_tab2;
2》 go
id val
----------- ----------
1 NO id
2 A
3 id is use
4 C
5 D
(5 行受影响)
mysql 执行insert返回自增长id
问题分析:通过insert操作之后,只能再查询自增ID即可
具体操作:MYSQL获取自增ID的四种方法
select max(id) from tablename
SELECT LAST_INSERT_ID() 函数
LAST_INSERT_ID 是与table无关的,如果向表a插入数据后,再向表b插入数据,LAST_INSERT_ID会改变。
select @@IDENTITY;
@@identity 是表示的是最近一次向具有identity属性(即自增列)的表插入数据时对应的自增列的值,是系统定义的全局变量。一般系统定义的全局变量都是以@@开头,用户自定义变量以@开头。
SHOW TABLE STATUS;
得出的结果里边对应表名记录中有个Auto_increment字段,里边有下一个自增ID的数值就是当前该表的最大自增ID.

更多文章:
在from子句中可以出现(如何在from 子句中嵌套查询下面的语句在access中出错!)
2026年10月11日 05:20
countif函数统计个数怎么用(countif函数怎么用 详解Excel中countif函数的使用方法)
2026年10月11日 03:30
正则匹配数字之前的字符(正则表达式如何匹配前面是数字、中间是“/”、后面也是数字,就像2/3专业的模式)
2026年10月11日 03:00
orlnsertbootmediinselected(我电脑开机显示这个是什么意思or insert boot media in select)
2026年10月10日 23:00
display的用法(display是什么意思 详解display的含义和用法)
2026年10月10日 22:00
html全部居中代码(怎么让网页居中显示,html如何让网页居中)
2026年10月10日 21:10




