`

mysql实现sequence

阅读更多
如何在mysql数据里使用Oracle序列语法.NEXTVAL和.CURVAL.
假设在mysql中序列的语法是:
      NEXTVAL('sequence');
      CURRVAL('sequence');
      SETVAL('sequence',value);
-- 1创建tas_music表
DROP TABLE IF EXISTS `tas_app`.`tas_music`;
CREATE TABLE  `tas_app`.`tas_music` (
`id` int(4) NOT NULL AUTO_INCREMENT,
`name` varchar(32) NOT NULL,
`icon` varchar(256) NOT NULL DEFAULT '',
`url` varchar(256) NOT NULL DEFAULT '',
`lyric` varchar(256) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2093 DEFAULT CHARSET=utf8;

-- 2创建序列表
DROP TABLE IF EXISTS `tas_app`.`tas_sequence`;
CREATE TABLE  `tas_app`.`tas_sequence` (
`name` varchar(50) NOT NULL,
`current_value` int(11) NOT NULL,
`increment` int(11) NOT NULL DEFAULT '1',
PRIMARY KEY (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- 3序列表里插入如下记录
insert into tas_app.tas_sequence values('music',23,1);

-- 4创建nextval function的代码如下:
DELIMITER $$
DROP FUNCTION IF EXISTS `nextval` $$
CREATE DEFINER=`admin`@`%` FUNCTION `nextval`(seq_name VARCHAR(50)) RETURNS int(11)
BEGIN
UPDATE tas_sequence
SET current_value = current_value + increment
WHERE name = seq_name;
RETURN currval(seq_name);
END $$
DELIMITER ;

-- 5创建setval function的代码如下:
DELIMITER $$
DROP FUNCTION IF EXISTS `setval` $$
CREATE DEFINER=`admin`@`%` FUNCTION `setval`(seq_name VARCHAR(50), value INTEGER) RETURNS int(11)
BEGIN
UPDATE tas_sequence
SET current_value = value
WHERE name = seq_name;
RETURN currval(seq_name);
END $$
DELIMITER ;

-- 6创建currval function的代码如下:
DELIMITER $$
DROP FUNCTION IF EXISTS `currval` $$
CREATE DEFINER=`admin`@`%` FUNCTION `currval`(seq_name VARCHAR(50)) RETURNS int(11)
BEGIN
  DECLARE value INTEGER;
  SET value = 0;
  SELECT current_value INTO value
  FROM tas_sequence
  WHERE name = seq_name;
  RETURN value;
END $$
DELIMITER ;

-- 7创建触发器
DELIMITER $$
drop trigger if exists tas_music_trigger $$
create trigger tas_music_trigger before insert on tas_music
for each row begin
if new.id is null or new.id = '' or new.id = 0 THEN
  set new.id = nextval('music');
end if;
end $$
DELIMITER ;

-- 8至此,向tas_music表插入数据时,如果id值为空,则id会取序列值.
1
0
分享到:
评论
1 楼 whitesock 2010-07-09  
DELIMITER $$
DROP FUNCTION IF EXISTS `nextval` $$
CREATE DEFINER=`root`@`localhost` FUNCTION `nextval`(seq_name VARCHAR(50)) RETURNS int(11)
BEGIN
UPDATE tas_sequence SET current_value = last_insert_id(current_value + increment) WHERE name = seq_name;
RETURN last_insert_id();
END $$
DELIMITER ;

相关推荐

    mysql实现sequence功能的代码

    mysql实现sequence功能 1.建立sequence记录表 CREATE TABLE `sys_sequence` ( `seq_name` varchar(50) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL, `min_value` int(11) NOT NULL, `max_value` int(11)...

    mysql中实现sequence.pdf

    mysql中实现sequence.pdf

    基于Mysql的Sequence实现方法

    找了一些相关的资料,发现mysql这方面的实现,原理都是一条数据库记录,不断update它的值。然后大部分的实现方案,都用到了函数。 贴一下网上的代码: 基于mysql函数实现 表结构 CREATE TABLE `t_sequence` ( `...

    在MySQL中创建实现自增的序列(Sequence)的教程

    主要介绍了在MySQL中创建实现自增的序列(Sequence)的教程,分别列举了两个实例并简单讨论了一些限制因素,需要的朋友可以参考下

    MySQL实现类似Oracle序列的方案

    MySQL实现类似Oracle的序列 Oracle一般使用序列(Sequence)来处理主键字段,而MySQL则提供了自增长(increment)来实现类似的目的; 但在实际使用过程中发现,MySQL的自增长有诸多的弊端:不能控制步长、开始索引、...

    Oracle与Mysql自动增长列(id)的区别

    Oracle必须通过创建sequence序列来实现自动增加列的功能。 首先要建立序列(当然必须要先建好表,添加好主键约束,这列假设约束名为test_sequence)  create sequence test_sequence [increment by 1]–增长的步长 ...

    MySQL分表自增ID问题的解决方法

    当我们对MySQL进行分表操作... 可以通过下面的方法来实现sequence特性产生唯一ID:  1. 通过MySQL表生成ID  对于插入也就是insert操作,首先就是获取唯一的id了,就需要一个表来专门创建id,插入一条记录,并获取最

    MySQL如何使用union all获得并集排序

    这样的实现比较简单,如下的order by语句就可以实现了。 order by PROMOTE_STATUS desc ,SEQUENCE_ID desc…… 结果移交测试之后,产品觉得这里可以优化下,文章的展示要改为已发布、待发布、已下线(没错,已下线...

    分布式id生成器.zip

    在实现上, UidGenerator通过借用未来时间来解决sequence天然存在的并发限制; 采用RingBuffer来缓存已生成的UID, 并行化UID的生产和消费, 同时对CacheLine补齐,避免了由RingBuffer带来的硬件级「伪共享」问题. 最终...

    MybatisGeneratorPlus.zip

    支持 Oracle 使用 SEQUENCE 实现自增主键:需要事先建立好表主键对应的SEQUENCE,并且SEQUENCE的名称作出了要求:格式为table_name_SEQUENCEModel 类支持 Builder 模式创建,示例代码:User user = new User.Builder...

    基于数据库的自动化生成工具,自动生成JavaBean、数据库文档、框架代码等(v5.8.8版_JAR)

    实现只要把数据数据库设计好,整个项目就完成了很大一部分代码的编写,大大节省了项目的开发成本。支持MySQL、Oracle、SQL Servce、PostgreSQL四种数据库,支持Window、Linux、MacBook等多种操作系统。 TableGo v...

    sql总结.doc

    (2)Mysql中搜索引擎Innodb(聚簇索引)和Mysiam(非聚簇索引)都采用B+,oracle也采用B+树实现 注:聚簇索引:一张表只能建立一个聚簇索引,以主键建立索引。聚簇索引包括主键索引和二级索引(二级索引是在对非主键...

    StrutsNews

    2.本程序部分实现AJAX功能,采用DWR框架。 3.程序运行环境为MYECLIPSE 5.0 + TOMACT 5.5 + ORACLE 9i 4.配置说明:将lib目录下的commons-pool-1.2.jar,commons-dbcp-1.2.jar,ojdbc14.jar复制到TOMACT目录下的...

    【总结】数据库自增字段的 3 种实现方式

    MySQL Oracle SQL Server PostgreSQL SQLite 标识列(IDENTITY) — :check_mark: :check_mark: :check_mark: — 序列(SEQUENCE) — :check_mark: :check_mark: :check_mark: — AUTO_INCREMENT :check_...

    oracle 创建字段自增长实现方式

    mysql等其他数据库中有随着记录的插入而表ID自动增长的功能,而oracle却没有这样的功能,我们有以下两种方式可以解决字段自增长的功能。  因为两种方式都需要通过创建序列来实现,这里先给出序列的创建方式。 ...

    Java 数据库主键生成类 IdWorker

    twitter在把存储系统从MySQL迁移到Cassandra的过程中由于Cassandra没有顺序ID生成机制,于是自己开发了一套全局唯一ID生成服务:Snowflake。 1 41位的时间序列(精确到毫秒,41位的长度可以使用69年) 2 10位的机器...

    两种oracle创建字段自增长的实现方式

    mysql等其他数据库中有随着记录的插入而表ID自动增长的功能,而oracle却没有这样的功能,我们有以下两种方式可以解决字段自增长的功能。 因为两种方式都需要通过创建序列来实现,这里先给出序列的创建方式。 CREATE ...

Global site tag (gtag.js) - Google Analytics