最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
当前位置: 首页 - 科技 - 知识百科 - 正文

[DB][MySql]关于取得自增字段的值、及@@IDENTITY与并发性问题_MySQL

来源:懂视网 责编:小采 时间:2020-11-09 19:47:23
文档

[DB][MySql]关于取得自增字段的值、及@@IDENTITY与并发性问题_MySQL

[DB][MySql]关于取得自增字段的值、及@@IDENTITY与并发性问题_MySQL:对于刚从Oracle转向MySql的人都会为,MySql中没有Oracle里的Sequence而感到困惑。MySql中没有了Sequence,那么MySql的主键用什么方式来实现最好呢? 主要有以下几种方式: 1、自增字段作为主键。【推荐方案】 MySql虽然比Oracle少了Seque
推荐度:
导读[DB][MySql]关于取得自增字段的值、及@@IDENTITY与并发性问题_MySQL:对于刚从Oracle转向MySql的人都会为,MySql中没有Oracle里的Sequence而感到困惑。MySql中没有了Sequence,那么MySql的主键用什么方式来实现最好呢? 主要有以下几种方式: 1、自增字段作为主键。【推荐方案】 MySql虽然比Oracle少了Seque

对于刚从Oracle转向MySql的人都会为,MySql中没有Oracle里的Sequence而感到困惑。MySql中没有了Sequence,那么MySql的主键用什么方式来实现最好呢?

主要有以下几种方式:

1、自增字段作为主键。【推荐方案】

MySql虽然比Oracle少了Sequence,但是多了字段的自增长特性。

插入完了以后可以通过执行【SELECT @@IDENTITY】获取上一条插入语句中生成的自增长字段的值。

这个语句很特别,没有关联到特定的SQL语句,会 让人感觉迷糊,他到底是怎么获取值的。在并发情况下会不会获取其他线程执行后的值。

答案是有可能的,但是不用怕、是可控的。只有不当的编码才会导致取到其他线程的值。先来说一下原理:

SUMMARY
The Jet OLE DB version 4.0 provider supports the SELECT @@Identity query that allows you to retrieve the value of the auto-increment field generated on your connection. Auto-increment values used on other connections to your database do not affect the results of this specialized query. This feature works with Jet 4.0 databases but not with older formats.

大致意思是【SELECT @@IDENTITY】获取的是当前数据库连接的前一次执行的值。其他连接执行的值不会影响当前线程。时下流行的框架(如Spring-jdbc、mybatis、hibernate)的数据库连接都是存在ThreadLocal中的、是线程隔离的,所以不会获取到其他线程中的【SELECT @@IDENTITY】值。当多线程编程时、强制把数据库连接传给各个线程同时执行时才会取到其他线程的【SELECT @@IDENTITY】。

2、在MySql中模拟Sequence

第一步:创建--Sequence 管理表

DROP TABLE IF EXISTS sequence; 
CREATE TABLE WFO_SEQ( 
 name VARCHAR(50) NOT NULL, 
 current_value INT NOT NULL, 
 increment INT NOT NULL DEFAULT 1, 
 PRIMARY KEY (name) 
) ENGINE=InnoDB; 
第二步:创建--取当前值的函数
DROP FUNCTION IF EXISTS currval; 
DELIMITER $ 
CREATE FUNCTION currval (seq_name VARCHAR(50)) 
 RETURNS INTEGER 
 LANGUAGE SQL 
 DETERMINISTIC 
 CONTAINS SQL 
 SQL SECURITY DEFINER 
 COMMENT '' 
BEGIN 
 DECLARE value INTEGER; 
 SET value = 0; 
 SELECT current_value INTO value 
 FROM WFO_SEQ
 WHERE name = seq_name; 
 RETURN value; 
END 
$ 
DELIMITER ; 
第三步:创建--取下一个值的函数

DROP FUNCTION IF EXISTS nextval; 
DELIMITER $ 
CREATE FUNCTION nextval (seq_name VARCHAR(50)) 
 RETURNS INTEGER 
 LANGUAGE SQL 
 DETERMINISTIC 
 CONTAINS SQL 
 SQL SECURITY DEFINER 
 COMMENT '' 
BEGIN 
 DECLARE C_V INTEGER;
 
 UPDATE WFO_SEQ SET CURRENT_VALUE = CURRENT_VALUE + INCREMENT WHERE NAME = SEQ_NAME;
 
 SET C_V = CURRVAL(SEQ_NAME);
 IF C_V = -1 THEN 
 INSERT INTO WFO_SEQ(NAME, CURRENT_VALUE, INCREMENT) 
 VALUES(SEQ_NAME, 1, 1);
 RETURN 1;
 END IF;
 RETURN C_V;
END 
$ 
DELIMITER ; 


第四步:创建--更新当前值的函数
DROP FUNCTION IF EXISTS setval; 
DELIMITER $ 
CREATE FUNCTION setval (seq_name VARCHAR(50), value INTEGER) 
 RETURNS INTEGER 
 LANGUAGE SQL 
 DETERMINISTIC 
 CONTAINS SQL 
 SQL SECURITY DEFINER 
 COMMENT '' 
BEGIN 
 UPDATE WFO_SEQ
 SET current_value = value 
 WHERE name = seq_name; 
 RETURN currval(seq_name); 
END 
$ 
DELIMITER ; 

第五步:测试函数功能

SELECT SETVAL('TestSeq', 10);---设置指定sequence的初始值
SELECT CURRVAL('TestSeq');--查询指定sequence的当前值
SELECT NEXTVAL('TestSeq');--查询指定sequence的下一个值

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文档

[DB][MySql]关于取得自增字段的值、及@@IDENTITY与并发性问题_MySQL

[DB][MySql]关于取得自增字段的值、及@@IDENTITY与并发性问题_MySQL:对于刚从Oracle转向MySql的人都会为,MySql中没有Oracle里的Sequence而感到困惑。MySql中没有了Sequence,那么MySql的主键用什么方式来实现最好呢? 主要有以下几种方式: 1、自增字段作为主键。【推荐方案】 MySql虽然比Oracle少了Seque
推荐度:
标签: 问题 mysql 并发
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top