Oracle 中可以创建 Sequence,下面创建一个 Sequence
CREATE SEQUENCE mysequence START WITH 1 INCREMENT BY 10
此 SEQUENCE的下一个值可以用 mysequence.nextval获得,比如
SELECT mysequence.nextval from dual.
或者
Insert into table( id, … ) values( mysequence.nextval, …)
MySQL不支持 Sequence, 可以用 stored procedure或 function模拟 Oracle Sequence
1) stored procedure 方法
创建数据库表:
create table mysequence
(
Id bigint not null auto_increment;
);
创建存储过程(使用动态 SQL):
DELIMITER $$
drop PROCEDURE if exists nextval$$
CREATE PROCEDURE nextval( seq_name varchar(64) )
BEGIN
SET @sql= concat( 'insert into ', seq_name, ' values(NULL)');
PREPARE s1 FROM @sql;
execute s1;
SET @sql = concat ( 'DELETE FROM ', seq_name);
PREPARE s2 FROM @sql;
execute s2;
select LAST_INSERT_ID();
END
$$
DELIMITER ;
调用存储过程获得 mysequence的下一个值:
Call { nextval(‘mysequence’) }
将获得的值插入表中:
Insert into mytable( id,…) values( generated_id, …)
2) function 方法
同样创建数据库表:
create table mysequence
(
Id bigint not null auto_increment;
);
创建一个函数:
DELIMITER$$
Drop function if exists `mysequence.nextval`$$
create function ` mysequence.nextval`()
RETURNS bigint
NOT DETERMINISTIC
READS SQL DATA
BEGIN
insert mysequence values( NULL );
delete from mysequence;
return LAST_INSERT_ID();
END
$$
DELIMITER ;
将 mysequence的下一个值插入表中:
Insert into mytable( id, … ) values( `mysequence.nextval`(), …);
第二种方法比较接近 Oracle的 Sequence使用方法