mysql创建序列效果

本文介绍了在MySQL中创建和使用序列的正确方法,包括如何创建序列、获取序列当前值和下一个值的函数,以及如何在触发器中应用序列实现字段自增效果。通过实例演示,确保在MySQL 5.5版本上执行成功。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  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的值。上面的所有操作亲测成功。如有疑问请留言

### 创建带有 `AUTO_INCREMENT` 列的 MySQL 表 在 MySQL 中,可以通过定义一个整数类型的列并将其设置为 `AUTO_INCREMENT` 来实现自动增长的功能。此功能通常用于主键列,以便每次插入新记录时都能自动生成唯一的标识符。 以下是创建带 `AUTO_INCREMENT` 的表的标准语法: ```sql CREATE TABLE table_name ( id INT AUTO_INCREMENT PRIMARY KEY, column1 VARCHAR(255), column2 DATETIME, ... ); ``` 在此示例中,`id` 是一个整数类型 (`INT`) 并被指定为 `AUTO_INCREMENT` 和主键[^1]。这意味着每当向该表插入一条新记录时,如果没有显式提供 `id` 值,则会为其分配下一个可用的唯一值。 如果需要调整已存在的表来启用 `AUTO_INCREMENT` 功能,可以使用如下语句: ```sql ALTER TABLE Bestelling MODIFY COLUMN Id INT AUTO_INCREMENT; ``` 然而,在某些情况下可能会遇到错误,比如当目标列为非主键或者存在其他约束条件时不支持直接修改为 `AUTO_INCREMENT` 属性[^3]。此时可能需要重新设计表格结构或将现有数据导出后再重建表格以满足新的需求。 对于已经设置了 `AUTO_INCREMENT` 的表来说,还可以通过特定命令重设其起始计数值。例如,假设我们希望将某个表的自增初始值设定回最小值或更新至最新最大ID之后的一个位置上,可执行下面的操作序列[^5]: ```sql DELETE FROM t WHERE id >= 1000; -- 将自增值恢复到当前数据的最大值加一的位置 ALTER TABLE t AUTO_INCREMENT = (SELECT MAX(id)+1 FROM t); INSERT INTO t VALUES(NULL,'Jerry'); SELECT * FROM t; ``` 以上脚本展示了如何先清理部分旧的数据条目,接着改变表的下一次插入索引号,并验证最终效果。 #### 注意事项 - 自动增量字段一般推荐作为主键的一部分。 - 如果尝试更改不是主键的列成为自动增加型态则可能导致失败[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值