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获得当前数值
+---------------------+
| 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自增字段相关知识点的详细说明: 1. **自增初始值设定**: - 当创建一个带有AUTO_INCREMENT属性的表时,可以使用`AUTO_INCREMENT=n`选项指定自增字段的初始值。 - 对于已存在的表,可以使用`ALTER ...
本问题主要涉及从Oracle迁移到MySQL时,如何处理自增序列(Identity或Sequence)的兼容性问题。Oracle数据库中,自增序列通常通过Sequence对象实现,而MySQL则通过在表定义中设置`AUTO_INCREMENT`属性来实现自增主键...
在MySQL中,自增序列(Sequence)是一种常用于生成唯一标识符的数据结构,尤其是在Oracle数据库中广泛使用。然而,MySQL自身并不直接支持Sequence,但可以通过创建表和存储过程来模拟这个功能。本教程将详细解释如何...
创建复合索引可以在同一张表内实现多个独立的自增序列。比如,创建一个由多个列组成的唯一索引,将自增列作为最后的列。这样,前面列的不同组合将对应不同的自增序列。 总的来说,理解MySQL中不同存储引擎对自增...
在Oracle数据库中,由于没有像MySQL的`auto_increment`或者SQL Server的`IDENTITY`这样的内置机制,所以自增序列的实现通常需要借助于Oracle的`SEQUENCE`对象。MyBatis,作为一个强大的ORM(对象关系映射)框架,...
在数据库迁移或特定业务逻辑中,经常会遇到需要在MySQL自增列中插入0值的需求。但MySQL的自增列默认行为是遇到NULL或0值时会自动填充下一个自增序列值,这会导致在执行插入操作时,原本应为0值的字段被自动替换为下...
然而,MySQL数据库并没有内置的序列功能。在Java应用程序中,如果需要在MySQL环境中实现类似Oracle序列的功能,我们需要自己设计解决方案。以下是一些关键知识点的详细说明: 1. **Java连接MySQL**: - 首先,你...
在本文中,我们将探讨如何利用Prometheus来统计MySQL数据库中自增主键的剩余可用百分比,这对于数据库健康管理和容量规划至关重要。 首先,我们需要安装和配置`mysqld_exporter`,这是一个用于收集MySQL性能指标的...
在MySQL数据库中,序列或ID生成方案是数据库设计的关键部分,尤其对于高并发系统而言,高效且无冲突的ID生成机制至关重要。本方案主要探讨如何在MySQL中实现一个可靠的序列/ID生成策略,以满足并发处理的需求。 ...
总结来说,理解MySQL自增ID的工作原理对于数据库设计和管理至关重要。在规划数据库时,应考虑可能的数据增长,并选择适当的数据类型来确保ID的可用性。在进行大量插入和删除操作时,尤其需要注意ID的管理和自增值的...
MySQL 数据库在处理自增(Auto Increment)ID 时,常常会遇到需要重置自增序列的情况,例如在数据初始化、测试环境复原或者数据清理之后。本文将介绍两种方法来实现 MySQL 自增 ID 从 1 开始重新排序。 方法一:...
最近公司业务涉及到了在相应库中添加自增序号这种操作,闲暇之余,整理如下,仅供参考~ 一、Hive 1、首先在Hive中建立一个测试表 create table xzw(id int, name string) clustered by (id) into 2 buckets ...
但在分表场景下,这个特性不再适用,因为不同表之间无法共享同一个自增序列。 一种解决办法是通过创建一个专门的表来生成ID,如创建一个名为`create_id`的表,其中包含一个自增主键`id`。当需要新的ID时,执行插入...
4. 恢复自增:如果因为某些原因导致自增序列中断,可以使用`ALTER TABLE table_name AUTO_INCREMENT = value`来重置自增值。 三、主键自增的使用场景 1. 用户ID:在用户注册系统中,通常会用主键自增生成唯一的用户...
MySQL序列是一组整数:1, 2, 3, …,由于一张数据表只能有一个字段自增主键, 如果你想实现其他字段也实现自动增加,就可以使用MySQL序列来实现。 本章我们将介绍如何使用MySQL的序列。 使用AUTO_INCREMENT MySQL中...
在MySQL数据库中,自增字段通常是用于自动增加序列值,比如在创建新记录时,主键ID会自动递增。然而,除了自增操作,我们有时也需要对字段执行自减操作,例如在处理计数器或者统计值时,如文章的评论数。本篇文章将...
`idname`用于区分不同类型的ID,`id`存储自增序列。关键在于使用`FOR UPDATE`锁,在`SELECT`语句后添加,确保在事务过程中对选中的记录进行行级锁定,阻止其他事务修改。通过存储过程`get_increment_id`,在事务中...