Mysql存储过程(五)——SEQUENCE的实现
来源:互联网 发布:快手早餐 知乎 编辑:程序博客网 时间:2024/06/03 20:39
在 oracle 中, sequence 提供多表多字段可共用一个不重复值。 Mysql 中存在自增列,基本可以满足 PK 的要求。但自增列存在限制:
a. 只能用于表中的一个字段,一张不能同时存在两个以上的自增列 ;
b. 自增列必须被定义为 key ( PK 或 FK ) ;
c. 自增列不能被多个表共用 ;
d. 当 insert 语句不包括自增字段或将其值设置为 NULL 时,该值会自动填上。
在不要求字段顺序递增的情况下,可以在 Mysql 中实现序列:
Sql code 5-1:
DROP TABLE IF EXISTS sequence; -- 建sequence表,指定seq列为无符号大整型,可支持无符号值:0(default)到18446744073709551615(0到2^64–1)。CREATE TABLE sequence ( name VARCHAR(50) NOT NULL, current_value BIGINT UNSIGNED NOT NULL DEFAULT 0, increment INT NOT NULL DEFAULT 1, PRIMARY KEY (name) -- 不允许重复seq的存在。) ENGINE=InnoDB; DELIMITER / DROP FUNCTION IF EXISTS currval / CREATE FUNCTION currval(seq_name VARCHAR(50)) RETURNS BIGINTBEGIN DECLARE value BIGINT; SELECT current_value INTO value FROM sequence WHERE upper(name) = upper(seq_name); -- 大小写不区分. RETURN value;END;/ DELIMITER ; DELIMITER / DROP FUNCTION IF EXISTS nextval / CREATE FUNCTION nextval (seq_name VARCHAR(50)) RETURNS BIGINT BEGIN DECLARE value BIGINT; UPDATE sequence SET current_value = current_value + increment WHERE upper(name) = upper(seq_name); RETURN currval(seq_name); END;/ DELIMITER ; DELIMITER / DROP FUNCTION IF EXISTS setval / CREATE FUNCTION setval (seq_name VARCHAR(50), value BIGINT) RETURNS BIGINTBEGIN UPDATE sequence SET current_value = value WHERE upper(name) = upper(seq_name); RETURN currval(seq_name); END;/ DELIMITER ;
在 SQL 中使用序列:
Sql code 5-2:
创建序列,往sequence表插入值即可:mysql> insert into sequence set name='myseq';查看当前已建序列:mysql> select * from sequence;+-------+---------------+-----------+| name | current_value | increment |+-------+---------------+-----------+| myseq | 0 | 1 |+-------+---------------+-----------+1 row in set (0.00 sec)获得序列的下一个值,第一次使用,因此值为1:mysql> select nextval('myseq');+------------------+| nextval('myseq') |+------------------+| 1 |+------------------+1 row in set (0.00 sec)
在存储过程中使用序列(以 sql code 1-1 中创建的 testproc 表为例),此存储过程返回插入后的 ID ,如果插入失败,则返回 -1 :
sql code 5-3:
create procedure test_sequence(IN i_name VARCHAR(100), OUT o_ret BIGINT)BEGIN DECLARE EXIT HANDLER FOR SQLWARNING,NOT FOUND,SQLEXCEPTION set o_ret = -1; set o_ret = nextval('myseq'); INSERT INTO testproc VALUES (o_ret,i_name); INSERT INTO testproc3 VALUES (o_ret,i_name);END;
- Mysql存储过程(五)——SEQUENCE的实现
- Mysql存储过程(五)——SEQUENCE的实现
- MySQL高级五——存储过程的管理
- MySQL进阶(五)——存储过程
- mysql-(五)-存储过程
- mysql数据库的存储过程(五)
- Mysql自学笔记五(存储过程)
- MySql索引,存储过程(五)
- MySql存储过程—1、SQL存储过程的基础知识
- MySql存储过程—1、SQL存储过程的基础知识
- MySql存储过程—1、SQL存储过程的基础知识
- MySQL的procedure(存储过程)实现动态的行转列
- MySQL知识(十四)——存储过程的创建
- T-SQL 语句(五) —— 存储过程
- (转载)基于Mysql的Sequence实现
- MySql存储过程—2、第一个MySql存储过程的建立
- MySql存储过程—2、第一个MySql存储过程的建立
- MySql存储过程—2、第一个MySql存储过程的建立
- MySQL-5.6.12 Replication
- Android4.0.4开机启动速度优化过程经验总结
- 1059. Prime Factors (25)-PAT
- C++:函数名前后加const
- e = e || window.event
- Mysql存储过程(五)——SEQUENCE的实现
- Java Integer(-128~127)值的==和equals比较产生的思考
- 第三方苹果开发库之ASIHTTPRequest(翻译版)
- 计算机高级语言与低级语言的区别
- 【AIX】采用vi语法编辑命令行
- 工作规划-2013.07.30
- Xcode隐藏功能
- 设计模式---模板方法模式
- Struts2 Spring hibernate 整合示例 .