`
foolraty
  • 浏览: 400210 次
  • 性别: Icon_minigender_1
  • 来自: 南宁
文章分类
社区版块
存档分类
最新评论

mysql 自增序列(转)

阅读更多

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,'00000001'); -> ELSE -> SET number = RIGHT(bh_id,8) + 1; -> SET new_bh = RIGHT(CONCAT('00000000',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 ;
 mysql> select nextval('MovieSeq');
+---------------------+
| 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 ;
 mysql> select setval('MovieSeq',150);
+------------------------+
| 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自增字段重排 mysql删除表后自增字段从1开始.pdf

    以下是对MySQL自增字段相关知识点的详细说明: 1. **自增初始值设定**: - 当创建一个带有AUTO_INCREMENT属性的表时,可以使用`AUTO_INCREMENT=n`选项指定自增字段的初始值。 - 对于已存在的表,可以使用`ALTER ...

    oracle迁移mysql自增序列问题

    本问题主要涉及从Oracle迁移到MySQL时,如何处理自增序列(Identity或Sequence)的兼容性问题。Oracle数据库中,自增序列通常通过Sequence对象实现,而MySQL则通过在表定义中设置`AUTO_INCREMENT`属性来实现自增主键...

    在MySQL中创建实现自增的序列(Sequence)的教程

    在MySQL中,自增序列(Sequence)是一种常用于生成唯一标识符的数据结构,尤其是在Oracle数据库中广泛使用。然而,MySQL自身并不直接支持Sequence,但可以通过创建表和存储过程来模拟这个功能。本教程将详细解释如何...

    mysql自增字段重排 mysql删除表后自增字段从1开始.docx

    创建复合索引可以在同一张表内实现多个独立的自增序列。比如,创建一个由多个列组成的唯一索引,将自增列作为最后的列。这样,前面列的不同组合将对应不同的自增序列。 总的来说,理解MySQL中不同存储引擎对自增...

    MyBatis Oracle 自增序列的实现方法

    在Oracle数据库中,由于没有像MySQL的`auto_increment`或者SQL Server的`IDENTITY`这样的内置机制,所以自增序列的实现通常需要借助于Oracle的`SEQUENCE`对象。MyBatis,作为一个强大的ORM(对象关系映射)框架,...

    MySQL自增列插入0值的解决方案

    在数据库迁移或特定业务逻辑中,经常会遇到需要在MySQL自增列中插入0值的需求。但MySQL的自增列默认行为是遇到NULL或0值时会自动填充下一个自增序列值,这会导致在执行插入操作时,原本应为0值的字段被自动替换为下...

    java通过Mysql实现类似oracle序列功能序列.rar

    然而,MySQL数据库并没有内置的序列功能。在Java应用程序中,如果需要在MySQL环境中实现类似Oracle序列的功能,我们需要自己设计解决方案。以下是一些关键知识点的详细说明: 1. **Java连接MySQL**: - 首先,你...

    使用prometheus统计MySQL自增主键的剩余可用百分比

    在本文中,我们将探讨如何利用Prometheus来统计MySQL数据库中自增主键的剩余可用百分比,这对于数据库健康管理和容量规划至关重要。 首先,我们需要安装和配置`mysqld_exporter`,这是一个用于收集MySQL性能指标的...

    Mysql(序列/ID)生成方案

    在MySQL数据库中,序列或ID生成方案是数据库设计的关键部分,尤其对于高并发系统而言,高效且无冲突的ID生成机制至关重要。本方案主要探讨如何在MySQL中实现一个可靠的序列/ID生成策略,以满足并发处理的需求。 ...

    关于MySQL自增ID的一些小问题总结

    总结来说,理解MySQL自增ID的工作原理对于数据库设计和管理至关重要。在规划数据库时,应考虑可能的数据增长,并选择适当的数据类型来确保ID的可用性。在进行大量插入和删除操作时,尤其需要注意ID的管理和自增值的...

    两种mysql对自增id重新从1排序的方法

    MySQL 数据库在处理自增(Auto Increment)ID 时,常常会遇到需要重置自增序列的情况,例如在数据初始化、测试环境复原或者数据清理之后。本文将介绍两种方法来实现 MySQL 自增 ID 从 1 开始重新排序。 方法一:...

    如何在Hive、MySQL、Oracle中分别添加自增序号

    最近公司业务涉及到了在相应库中添加自增序号这种操作,闲暇之余,整理如下,仅供参考~ 一、Hive  1、首先在Hive中建立一个测试表 create table xzw(id int, name string) clustered by (id) into 2 buckets ...

    MySQL分表自增ID问题的解决方法

    但在分表场景下,这个特性不再适用,因为不同表之间无法共享同一个自增序列。 一种解决办法是通过创建一个专门的表来生成ID,如创建一个名为`create_id`的表,其中包含一个自增主键`id`。当需要新的ID时,执行插入...

    Mysql面试题主键自增

    4. 恢复自增:如果因为某些原因导致自增序列中断,可以使用`ALTER TABLE table_name AUTO_INCREMENT = value`来重置自增值。 三、主键自增的使用场景 1. 用户ID:在用户注册系统中,通常会用主键自增生成唯一的用户...

    MySQL 序列 AUTO_INCREMENT详解及实例代码

    MySQL序列是一组整数:1, 2, 3, …,由于一张数据表只能有一个字段自增主键, 如果你想实现其他字段也实现自动增加,就可以使用MySQL序列来实现。 本章我们将介绍如何使用MySQL的序列。 使用AUTO_INCREMENT MySQL中...

    MySQL字段自增自减的SQL语句示例介绍

    在MySQL数据库中,自增字段通常是用于自动增加序列值,比如在创建新记录时,主键ID会自动递增。然而,除了自增操作,我们有时也需要对字段执行自减操作,例如在处理计数器或者统计值时,如文章的评论数。本篇文章将...

    利用mysql事务特性实现并发安全的自增ID示例

    `idname`用于区分不同类型的ID,`id`存储自增序列。关键在于使用`FOR UPDATE`锁,在`SELECT`语句后添加,确保在事务过程中对选中的记录进行行级锁定,阻止其他事务修改。通过存储过程`get_increment_id`,在事务中...

Global site tag (gtag.js) - Google Analytics