资讯专栏INFORMATION COLUMN

mysql实现nextVal功能,即使用代理表实现其他表的主键自增长

ISherry / 2293人阅读

摘要:首先创建表插入记录执行函数查询记录如果出现错误,则执行如下继续执行当前记录则成功创建函数创建好了表之后如图字段为代理表名称,原来为,此处我修改了,为当前序号,为步长。

首先创建表:CREATE TABLE sys_sequence (
NAME varchar(50) NOT NULL,
CURRENT_VALUE int(11) NOT NULL DEFAULT "0",
INCREMENT int(11) NOT NULL DEFAULT "1",
PRIMARY KEY (NAME)
)
插入记录:INSERT INTO SYS_SEQUENCE(NAME,CURRENT_VALUE,INCREMENT) VALUES("TBL_FS", 1,1)
执行函数:DELIMITER $$

DROP FUNCTION IF EXISTS currval$$

CREATE DEFINER=root@% FUNCTION currval(seq_name VARCHAR(50)) RETURNS INT(11)
BEGIN
DECLARE VALUE INTEGER;
SET VALUE=0;
SELECT current_value INTO VALUE
FROM sys_sequence
WHERE NAME=seq_name;
RETURN VALUE;
END$$

DELIMITER ;
查询记录:select currval("TBL_FS");
如果出现Error Code: 1449 The user specified as a definer ("root"@"%") does not exist 错误,则执行如下sql:grant all privileges on . to root@"%" identified by "password";
flush privileges;

继续执行当前记录sql则成功
创建nextval函数 :
DELIMITER $$
DROP FUNCTION IF EXISTS nextval$$

CREATE DEFINER=root@% FUNCTION nextval(seq_name varchar(50)) RETURNS int(11)
BEGIN
UPDATE sys_sequence
SET CURRENT_VALUE = CURRENT_VALUE + INCREMENT
where name=seq_name;
return currval(seq_name);
END$$
创建好了表之后 :如图

NAME字段为代理表名称,原来为 TBL_FS,此处我修改了,current_value为当前序号,INCREMENT为步长。

接下来在mybatis配置文件目录下创建mapper文件:

"http://mybatis.org/dtd/mybatis-3-mapper.dtd">    



接下来在service层写对应的获取数据方法:
@Service
public class MySQLFunctionServiceImpl implements MySQLFunctionService{

@Resource(name = "daoSupport")
private DaoSupport dao;    //DaoSupport封装了对应mybatis操作数据库的方法,上篇文章有介绍

@Override
public int getNexVal(String table_name) {
    // TODO Auto-generated method stub
    return (int) dao.findForObject("MySQLFunctionMapper.getNexVal", table_name);
}

@Override
public int getCurrVal(String table_name) {
    // TODO Auto-generated method stub
    return (int) dao.findForObject("MySQLFunctionMapper.getCurrVal", table_name);
}

}

这样就可以调用getNexVal方法获取代理表中的ID值,再对应赋值到其他表的主键中,一般可在controller调用给其他表的主键赋值后存入数据库

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/69852.html

相关文章

  • 记录不存在则插入,存在则更新 → MySQL实现方式有哪些?

    摘要:需求背景环境版本开发规范公司后端开发规范有这么一点更新数据库表中数据的时候,不允许先删,然后批量插入需要将入参与表中数据比判断,找出哪些是新插入,哪些需要更新,哪些是删除的,然后再做对应的数据操作需求我们有表如下当商 ...

    pingan8787 评论0 收藏0
  • Mycat的实践二:全局序列号

    摘要:这里应该是的显示,配置成了时间戳序列方式了,显示的还是本地文件方式部分安装参考百度初始化插入等测试受影响的行时间总结我们在分布式的环境下,建议全局序列的顺序 上一节回顾 如果你还初识mycat,你可以阅读 Mycat的实践一:初始Mycat 遇到的问题 通过上一节的学习,我们遇到了一个insert无法插入的问题 我们思考一个问题,我们上一节在mysql上创建了3个分库,每个分库下每一...

    DesGemini 评论0 收藏0
  • hibernate学习概要

    摘要:一中实体规则实体类创建的注意事项持久化类提供无参数构造成员变量私有,提供方法访问,需提供属性属性就是方法持久化类中的属性,应尽量使用包装类型可以表示,在插如数据库中有作用持久化类需要提供主键属性与数据库中主键列对应不需要修饰原因使用代理生成 一、hibernate中实体规则 实体类创建的注意事项 1.持久化类提供无参数构造2.成员变量私有,提供get、set方法访问,需提供属性(属性就...

    Noodles 评论0 收藏0

发表评论

0条评论

ISherry

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<