在 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 BIGINT
BEGIN
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 BIGINT
BEGIN
UPDATE sequence
SET current_value = value
WHERE upper(name) = upper(seq_name);
RETURN currval(seq_name);
END;
/
DELIMITER ;
在 SQL 中使用序列:
Sql code 5-2:
[c-sharp] view plaincopy
创建序列,往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:
[c-sharp] view plaincopy
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;
转载地址:http://blog.csdn.net/crazylaa/article/details/5368447
分享到:
相关推荐
NULL 博文链接:https://snowelf.iteye.com/blog/575555
mysql中实现sequence.pdf
下面小编就为大家带来一篇基于Mysql的Sequence实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
在Oracle数据库中,sequence等同于序列号,每次取的时候sequence会自动增加,一般会作用于需要按序列号排序的地方。 1、Create Sequence (注释:你需要有CREATE SEQUENCE或CREATE ANY SEQUENCE权限) CREATE ...
教你如何使用oracle中的sequence,实现主键自动增长
主要介绍了在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)...
通过内存+文件IO的方式实现集群和单机环境下的本地Sequence实现策略。原理与数据库Sequence相同,性能为本地的(++)运算。适用于入库前便需要取得Sequence的复杂业务逻辑。 配置数据请根据自己的环境自己配置。 ...
———————————————————————————————————————————————— 此处使用的数据集包含每个手写单词的图像,并以短划线分隔的文件名格式。 第一个字段代表单词id,第二个字段...
Oracle一般使用序列(Sequence)来处理主键字段,而MySQL则提供了自增长(increment)来实现类似的目的; 但在实际使用过程中发现,MySQL的自增长有诸多的弊端:不能控制步长、开始索引、是否循环等;若需要迁移数据库,...
gold sequence C语言实现子程序 31位长可用于lte 下行信道
在Oracle数据库移植过程中,sequence可能失效,本资源可使失效的sequence重新恢复作用
Sequence to Sequence Learning with Neural Networksv论文PDF版
REVERSING THE TRAIL SEQUENCE ————— 104 PARAMETERS ———— 107 GLOBALS PARAMETERS 109 MANAGER PARAMETERS ———— 110 EXTRACT PARAMETERS———— 113 REPLICAT PARAMETERS ———— 122 DATA MAPPING ...
mysql-序列 nodejs的mysql序列生成器
机器学习之sequence to sequence learning。(Sequence Generation-----Hung-yi Lee 李宏毅.ppt)
基于循环神经网络和注意力机制的Sequence-to-Sequence模型神经网络方法在信息抽取和自动摘要生成方面发挥了重要作用。然而,该方法不能充分利用文本的语言特征信息,且生成结果中存在未登录词问题,从而影响文本摘要...
SequenceDiagram-3.0.5.zip