MySQL模拟Oracle的Sequence两种方法

<!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:"/@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0in; margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:宋体;} @page Section1 {size:8.5in 11.0in; margin:1.0in 1.25in 1.0in 1.25in; mso-header-margin:.5in; mso-footer-margin:.5in; mso-paper-source:0;} div.Section1 {page:Section1;} /* List Definitions */ @list l0 {mso-list-id:54815324; mso-list-type:hybrid; mso-list-template-ids:1437342586 67698705 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;} @list l0:level1 {mso-level-text:"%1/)"; mso-level-tab-stop:.5in; mso-level-number-position:left; text-indent:-.25in;} ol {margin-bottom:0in;} ul {margin-bottom:0in;} -->

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使用方法

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值