1.什么是序列?
序列: 可供多个用户用来产生唯一数值的数据库对象
2.为什么用序列?
自动提供唯一的数值
共享对象
主要用于提供主键值
将序列值装入内存可以提高访问效率
3.怎么用序列?(重点)
oracle序列和mysql序列
oracle序列
创建
CREATE SEQUENCE dept_deptid_seq
INCREMENT BY 10 --每次增长的数值
START WITH 120 --从哪个值开始
MAXVALUE 9999 --最大值
[{MINVALUE n | NOMINVALUE}]
NOCACHE --是否缓存
NOCYCLE;--是否循环
查询
SELECT dept_deptid_seq.NEXTVAL FROM dual
SELECT dept_deptid_seq.CURRVAL FROM dual
修改
ALTER SEQUENCE dept_deptid_seq
INCREMENT BY 20
MAXVALUE 999999
NOCACHE
NOCYCLE;
删除
DROP SEQUENCE dept_deptid_seq;
mysql序列
创建sequence表
CREATE TABLE IF NOT EXISTS `sequence` ( `name` varchar(50) NOT NULL, `current_value` int(11) NOT NULL, `increment` int(11) NOT NULL DEFAULT '1' ) ENGINE=MyISAM DEFAULT CHARSET=utf8 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC COMMENT='序列表,命名s_[table_name]'; INSERT INTO `sequence` (`name`, `current_value`, `increment`) VALUES ('s_blog_account', 0, 1) |
创建nextval和currentval函数
DROP FUNCTION IF EXISTS `currval`; DELIMITER // CREATE FUNCTION `currval`(seq_name VARCHAR(50)) RETURNS int(11) READS SQL DATA DETERMINISTIC BEGIN DECLARE VALUE INTEGER; SET VALUE = 0; SELECT current_value INTO VALUE FROM sequence WHERE NAME = seq_name; RETURN VALUE; END// DELIMITER ; |
DROP FUNCTION IF EXISTS `nextval`; DELIMITER // CREATE FUNCTION `nextval`(seq_name VARCHAR(50)) RETURNS int(11) DETERMINISTIC BEGIN UPDATE sequence SET current_value = current_value + increment WHERE NAME = seq_name; RETURN currval(seq_name); END// DELIMITER ; |
维护序列表就可以完成对序列的维护,通过DML完成序列的增删改查操作
最后使用select nextval("s_blog_account")即可得到下一个值