mysql中生成唯一序列号方式
使用系统提供的序列化生成方式auto_increment
1)、在开启事务回滚,重新插入后出现空洞(id不连续)
生成唯一序列号
生成序列号的方法
生成序列号的方法
需要使用唯一序列号的场景:
1. 作为数据库主键。
2. 业务序列号。
生成序列号的方法:
- MySQL:AUTO_INCREMENT
- SQLServer:IDENTITY/SEQUENCE
- Oracle:SEQUENCE
- PgSQL:SEQUENCE
如何选择生成序列号的方式:
【原则】:优先选择系统提供的序列号生成方式。
【优点】:
1. 控制并发;
2. 不重复,保证序列号的唯一性。
【缺点】:序列号不连续(数据空洞),例如 1、2、4。
【原因】:对已有的数据的删除,以及事务回滚等方式不会影响自增长的序号,例如已有数据 1、2、3,删除 3 号数据。之后再插入一条数据,此时数据表的数据为 1、2、4。
需要使用唯一序列号的场景:
1. 作为数据库主键。
2. 业务序列号:如发票号、车票号、订单号等。
生成序列号的方法:
- MySQL:AUTO_INCREMENT
- SQLServer:IDENTITY/SEQUENCE
- Oracle:SEQUENCE
- PgSQL:SEQUENCE
如何选择生成序列号的方式:
【原则】:优先选择系统提供的序列号生成方式。
【优点】:
1. 控制并发;
2. 不重复,保证序列号的唯一性。
【缺点】:
1. 序列号不连续(数据空洞),例如 1、2、4。
【原因】:对已有的数据的删除,以及事务回滚等方式不会影响自增长的序号,例如已有数据 1、2、3,删除 3 号数据。之后再插入一条数据,此时数据表的数据为 1、2、4。
需要使用唯一序列号的场景:
1. 作为数据库主键。
2. 业务序列号:如发票号、车票号、订单号等。
生成序列号的方法:
- MySQL:AUTO_INCREMENT
- SQLServer:IDENTITY/SEQUENCE
- Oracle:SEQUENCE
- PgSQL:SEQUENCE
如何选择生成序列号的方式:
【原则】:优先选择系统提供的序列号生成方式。
【优点】:
1. 控制并发;
2. 不重复,保证序列号的唯一性。
【缺点】:
1. 序列号不连续(数据空洞),例如 1、2、4。
【原因】:对已有的数据的删除,以及事务回滚等方式不会影响自增长的序号,例如已有数据 1、2、3,删除 3 号数据。之后再插入一条数据,此时数据表的数据为 1、2、4。
CREATE TABLE order_seq(
timestr INT UNSIGNED,
order_sn INT UNSIGNED,
);
DELIMITER //
CREATE PROCEDURE seq_no()
BEGIN
DECLARE v_cnt INT;
DECLARE v_timestr INT;
DECLARE rowcount BIGINT;
SET v_timestr = DATE_FORMAT(NOW(),'%Y%m%d');
SELECT ROUND(RAND()*100,0)+1 INTO v_cnt;
START TRANSACTION;
UPDATE order_seq SET order_sn = order_sn + v_cnt WHERE timestr = v_timestr;
IF ROW_COUNT() = 0 THEN
INSERT INTO order_seq(timestr,order_sn) VALUES(v_timestr,v_cnt);
END IF;
SELECT CONCAT(v_timestr,LPAD(order_sn,7,0))AS order_sn
FROM order_seq WHERE timestr = v_timestr;
COMMIT;
END//
DELIMITER ;
CALL seq_no();·
@MySQL---生成唯一序列号方式
优先使用系统提供的生成序列号方式
MySQL:AUTO_INCREMENT
SQLServer:INENTITY/SEQUENCE
Oracle:SEQUENCE
PgSQL:SEQUENCE