mysql创建序列效果

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Esc_Tab_End/article/details/80342859
  1. 新建序列表
drop table if exists sequence;     
create table sequence (         
seq_name        VARCHAR(50) NOT NULL, -- 序列名称         
current_val     INT         NOT NULL, -- 当前值         
increment_val   INT         NOT NULL    DEFAULT 1, -- 步长(跨度)         
PRIMARY KEY (seq_name)   ); 

2 新增一个序列

INSERT INTO sequence VALUES ('seq_test1_num1', '0', '1');  
INSERT INTO sequence VALUES ('seq_test1_num2', '0', '2'); 

3.创建 函数 用于获取序列当前值(v_seq_name 参数值 代表序列名称)

create function currval(v_seq_name VARCHAR(50))     
returns integer    
begin        
    declare value integer;         
    set value = 0;         
    select current_val into value  from sequence where seq_name = v_seq_name;   
   return value;   
end; 

如果大家在mysql中执行上面的语句时,会报错。因为不是这样写的。上面是个错误案例。原因是版本问题。我用的版本是5.5的,据说高版本的是可以的。下面正确案例:

DELIMITER //
create function currval(in_seq_name varchar(50)) returns integer  
begin
    declare value integer  ;
    set value = 0;
    select current_val into value  from sequence where seq_name = in_seq_name ;
   return value;
end//  
DELIMITER ;

需要DELIMITER起头,表示开始执行。如果不用会报错。

4 查询当前值

select currval('seq_test1_num1');  

5创建 函数 用于获取序列下一个值(v_seq_name 参数值 代表序列名称)

DELIMITER //
create function nextval (in_seq_name VARCHAR(50))  
    returns integer  
begin  
    update sequence set current_val = current_val + increment_val  where seq_name = in_seq_name ;  
    return currval(in_seq_name );  
end//  
DELIMITER ; 

6 查询下一个值

select nextval('seq_test1_num1'); 

7.新建表 用于测试的表

DROP TABLE IF EXISTS test1;  
CREATE TABLE test1 (  
  name varchar(255) NOT NULL,  
  value double(255,0) DEFAULT NULL,  
  num1 int(11) DEFAULT NULL,  
  num2 int(11) DEFAULT NULL,  
  PRIMARY KEY (name)  
); 

8 新建触发器 插入新纪录前给自增字段赋值实现字段自增效果

DELIMITER //
CREATE TRIGGER trig_ls BEFORE INSERT ON test1 FOR EACH ROW BEGIN  
set NEW.num1 = nextval('seq_test1_num1');  
END//  
DELIMITER ;

9 最后测试自增效果

INSERT INTO test1 (name, value) VALUES ('1', '111');  
INSERT INTO test1 (name, value) VALUES ('2', '222');  
INSERT INTO test1 (name, value) VALUES ('3', '333');  
INSERT INTO test1 (name, value) VALUES ('4', '444');

10 结果展示

SELECT * FROM test1; 

这里写图片描述
因为触发器只创建了new.num1的值。所以上去就只有num1的值。上面的所有操作亲测成功。如有疑问请留言

猜你喜欢

转载自blog.csdn.net/Esc_Tab_End/article/details/80342859