mysql自增和序列的区别_mysql 自增序列(转)

本文介绍了在MySQL中创建和管理自增序列的两种方法。第一种是通过触发器,当向表tb插入数据时,自动生成带有日期和递增编号的唯一ID。第二种方法是创建一个名为sequence的表,用于记录序列号,并提供了currval、nextval和setval三个函数进行序列的获取、更新和设置。这两种方法实现了类似序列的功能,但不同于内置的自增列。
摘要由CSDN通过智能技术生成

1:原理是在建立一个触发器TRIGGER tri_NewBH  在table插入时执行序列计算

mysql> CREATE TABLE tb(BH CHAR(16),content VARCHAR(20),`date` DATETIME,val INT);

Query OK, 0 rows affected (0.05 sec)

mysql>

mysql>

mysql> DELIMITER $$

mysql> DROP TRIGGER IF EXISTS tri_NewBH $$

Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql>

mysql> CREATE TRIGGER tri_NewBH BEFORE INSERT ON tb

-> FOR EACH ROW

-> BEGIN

-> DECLARE dt CHAR(8);

-> DECLARE bh_id CHAR(16);

-> DECLARE number INT;

-> DECLARE new_bh VARCHAR(16);

->

-> SET dt = DATE_FORMAT(CURDATE(),'%Y%m%d');

->

-> SELECT

-> MAX(BH) INTO bh_id

-> FROM tb

-> WHERE BH LIKE CONCAT(dt,'%');

->

-> IF bh_id = '' OR bh_id IS NULL THEN

-> SET new_bh = CONCAT(dt,'');

-> ELSE

-> SET number = RIGHT(bh_id,8) + 1;

-> SET new_bh = RIGHT(CONCAT('',number),8);

-> SET new_bh=CONCAT(dt,new_bh);

-> END IF;

->

-> SET NEW.BH = new_bh;

-> END$$

Query OK, 0 rows affected (0.09 sec)

mysql>

mysql> DELIMITER ;

mysql> INSERT INTO tb(content,`date`,val) VALUES('LiangCK','2009-05-11',20);

Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO tb(content,`date`,val) VALUES('LiangCK','2009-05-11',20);

Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO tb(content,`date`,val) VALUES('LiangCK','2009-05-11',20);

Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO tb(content,`date`,val) VALUES('LiangCK','2009-05-11',20);

Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO tb(content,`date`,val) VALUES('LiangCK','2009-05-11',20);

Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO tb(content,`date`,val) VALUES('LiangCK','2009-05-11',20);

Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO tb(content,`date`,val) VALUES('LiangCK','2009-05-11',20);

Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM tb;

+------------------+---------+---------------------+------+

| BH | content | date | val |

+------------------+---------+---------------------+------+

| 2009051100000001 | LiangCK | 2009-05-11 00:00:00 | 20 |

| 2009051100000002 | LiangCK | 2009-05-11 00:00:00 | 20 |

| 2009051100000003 | LiangCK | 2009-05-11 00:00:00 | 20 |

| 2009051100000004 | LiangCK | 2009-05-11 00:00:00 | 20 |

| 2011051200000001 | LiangCK | 2009-05-11 00:00:00 | 20 |

| 2011051200000002 | LiangCK | 2009-05-11 00:00:00 | 20 |

| 2011051200000003 | LiangCK | 2009-05-11 00:00:00 | 20 |

+------------------+---------+---------------------+------+

7 rows in set (0.00 sec)

2.下面就是另外一个的实现方案:

原理是创建一个专门记录序列的表sequence,记录有当前序列号,序列的间隔如+1

DROP TABLE IF EXISTS sequence;/*创建记录当前序列的表*/

CREATE TABLE sequence (

name VARCHAR(50) NOT NULL,

current_value INT NOT NULL,

increment INT NOT NULL DEFAULT 1,

PRIMARY KEY (name)

) ENGINE=InnoDB;

INSERT INTO sequence VALUES ('MovieSeq',3,5);

DROP FUNCTION IF EXISTS currval;

DELIMITER $/*创建一个获取当前序列的function*/

CREATE FUNCTION currval (seq_name VARCHAR(50))

RETURNS INTEGER

CONTAINS SQL

BEGIN

DECLARE value INTEGER;

SET value = 0;

SELECT current_value INTO value

FROM sequence

WHERE name = seq_name;

RETURN value;

END$

DELIMITER ;

测试一下结果:

mysql> SELECT currval('MovieSeq');

+---------------------+

| currval('MovieSeq') |

+---------------------+

| 3 |

+---------------------+

1 row in set (0.00 sec)

mysql> SELECT currval('x');

+--------------+

| currval('x') |

+--------------+

| 0 |

+--------------+

1 row in set, 1 warning (0.00 sec)

mysql> show warnings;

+---------+------+------------------+

| Level | Code | Message |

+---------+------+------------------+

| Warning | 1329 | No data to FETCH |

+---------+------+------------------+

1 row in set (0.00 sec)

nextval

//获取下一个数值..先在sequence里面调用update当前最大数值+1然后再调用currval获得当前数值

DROP FUNCTION IF EXISTS nextval;

DELIMITER $

CREATE FUNCTION nextval (seq_name VARCHAR(50))

RETURNS INTEGER

CONTAINS SQL

BEGIN

UPDATE sequence

SET current_value = current_value + increment

WHERE name = seq_name;

RETURN currval(seq_name);

END$

DELIMITER ;

+---------------------+

| nextval('MovieSeq') |

+---------------------+

| 15 |

+---------------------+

1 row in set (0.09 sec)

mysql> select nextval('MovieSeq');

+---------------------+

| nextval('MovieSeq') |

+---------------------+

| 20 |

+---------------------+

1 row in set (0.01 sec)

mysql> select nextval('MovieSeq');

+---------------------+

| nextval('MovieSeq') |

+---------------------+

| 25 |

+---------------------+

1 row in set (0.00 sec)

setval

DROP FUNCTION IF EXISTS setval;

DELIMITER $

CREATE FUNCTION setval (seq_name VARCHAR(50), value INTEGER)

RETURNS INTEGER

CONTAINS SQL

BEGIN

UPDATE sequence

SET current_value = value

WHERE name = seq_name;

RETURN currval(seq_name);

END$

DELIMITER ;

+------------------------+

| setval('MovieSeq',150) |

+------------------------+

| 150 |

+------------------------+

1 row in set (0.06 sec)

mysql> select curval('MovieSeq');

+---------------------+

| currval('MovieSeq') |

+---------------------+

| 150 |

+---------------------+

1 row in set (0.00 sec)

mysql> select nextval('MovieSeq');

+---------------------+

| nextval('MovieSeq') |

+---------------------+

| 155 |

+---------------------+

1 row in set (0.00 sec)

更改(修改)mysql自动增序列改变从1000开始

更改(修改)mysql自动增序列改变从1000开始 ************************************************************************** ...

MySQL自增序列-亲试ok

#1.创建sequence表,公共的 DROP TABLE IF EXISTS sequence; CREATE TABLE sequence (      name VARCHAR(30) NOT ...

mysql 数据库自增id 的总结

有一个表StuInfo,里面只有两列 StuID,StuName其中StuID是int型,主键,自增列.现在我要插入数据,让他自动的向上增长,insert into StuInfo(StuID,Stu ...

MySQL 设计与开发规范

MySQL 设计与开发规范 1 目的 本规范的主要目的是希望规范数据库设计与开发,尽量避免由于数据库设计与开发不当而产生的麻烦:同时好的规范,在执行的时候可以培养出好的习惯,好的习惯是软件质量的很好保 ...

达达O2O后台架构演进实践:从0到4000高并发请求背后的努力

1.引言   达达创立于2014年5月,业务覆盖全国37个城市,拥有130万注册众包配送员,日均配送百万单,是全国领先的最后三公里物流配送平台. 达达的业务模式与滴滴以及Uber很相似,以众包的方式利 ...

mysql 模拟一个自增序列

文章出处:https://sdu0rj.axshare.com/%E4%BA%8C%E7%BA%A7%E5%AE%A2%E6%88%B7%E7%AE%A1%E7%90%86.html mysql没有像 ...

MySQL对字段新增自增序列

现在有这样的场景,我们的数据库类型是MySQL,表是从其他库拿过来的,约束和索引都没迁移.现在希望增加一个自增序列. 且自增序列是从当前最大自增ID开始的,下面就是这样一个过程的演示. mysql&g ...

MySQL进阶14--标识列(自增序列/auto_increment)--设置/展示步长--设置/删除标示列

/*进阶14 标识列 又称为自增序列; 含义 : 可以不用手动的插入值, 系统提供默认的序列值(1-->n) 特点 : 1.标识列必须和主键搭配? 不一定,但要求是一个key 2.一个表可以有几 ...

MySQL用变量的方法添加伪序号列(自增序列)

在进行数据筛选时,可能会用到给每一条数据配上一个唯一的序号,便于进行定位. 方法: 序号的设置:   @rownum :=@rownum + 1 AS rownum 获取序号的伪表[必须]:   (S ...

随机推荐

zzz

开放平台(TOP)的API是基于HTTP协议来调用的,开发者(ISV)可以直接使用TOP提供的官方SDK(支持多种语言,包含了请求的封装,签名加密,响应解释,性能优化等)来调用,也可以根据TOP的协议 ...

更新日志 - fir.im 新版优化上线

经过这段时间的用户反馈收集和新版本的功能调研,我们对 fir.im Rio 上传下载.应用管理再次做了调整优化.感谢之前内测用户的反馈与建议.目前 fir.im Rio 新版已正式上线,主要优化有以下 ...

Android WebView 开发教程

声明在先:必须在AndroidMainfest.xml 里面声明权限,否则在Java里面编写的所有WebView浏览网页的代码都无法正常使用

Uva 548 Tree

0.这是一道利用中序遍历和后序遍历确定二叉树的题目,学会建树 关键点理解这段代码 int build(int L1,int R1,int L2,int R2) { //printf("bui ...

iOS开发UI篇—transframe属性(形变)

iOS开发UI篇—transframe属性(形变) 1. transform属性 在OC中,通过transform属性可以修改对象的平移.缩放比例和旋转角度 常用的创建transform结构体方法分两 ...

So many interfaces!

http://stackoverflow.com/questions/4817369/why-does-does-it-really-listt-implement-all-these-interfa ...

Android之自定义Adapter的ListView

ListView的创建,一般要具备两大元素: 1)数据集,即要映射的字符串.图片信息之类. 2)适配器,实现把要映射的字符串.图片信息映射成视图(如Textview.Image等组件),再添加到Lis ...

JAVAEE学习路线分享

今天把我的教学经验分享给大家.适合大多数人的学习路线.注:目前作者已经转行做java培训. 首先是培养兴趣.先开始学习HTML知识.也就是做网页,从这里开始比较简单,就是几个标签单词需要记住. 接着开 ...

Cocos2d-x 3.2Lua演示样例UserDefaultTest(用户默认配置)

Cocos2d-x 3.2演示样例UserDefaultTest(用户默认配置) 本篇博客介绍Cocos2d-x 3.2演示样例中的UserDefaulstTest,我们在开发中可能须要用到一些默认配 ...

基于VUE选择上传图片并在页面显示(图片可删除)

demo例子: 依赖文件 : http://files.cnblogs.com/files/zhengweijie/jquery.form.rar HTML文本内容: ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值