版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Esc_Tab_End/article/details/80342859
- 新建序列表
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的值。上面的所有操作亲测成功。如有疑问请留言