Mysql和Oracle数据库实现主键的自动增长的区别

MySQL建表时必须有一个主键(PRIMARY KEY), 并且每条主键内容必须唯一,作为该条数据在表中的唯一标识。同时常常给主键一个”auto_increment”属性,让主键所在字段每条记录都自增”1″。
例如某张表中的”id”作为主键,则mybatis中添加数据的写法可以是:


		INSERT INTO SMART_USER(USERNAME, PASSWORD, AGE, GENDER) VALUES
		(#{userName},#{password},#{age},#{gender})

Oracle没有这个”auto_increment”属性,所以它没法像MySQL般在表内定义自增主键。但是,Oracle里的序列(SEQUENCE)和触发器(TRIGGER),可间接实现自增主键的作用。下面总结了三种oracle中实现主键自增长的方式

1.从数据库查询最大的id值,然后在此基础上加1


  		
  			select nvl(max(id),0)+1 from SMART_USER
  		
  		INSERT INTO SMART_USER(ID, USERNAME, PASSWORD, AGE, GENDER) VALUES
		(#{id,jdbcType=DECIMAL},#{userName,jdbcType=VARCHAR},#{password,jdbcType=VARCHAR},#{age,jdbcType=DECIMAL},#{gender,jdbcType=VARCHAR})

2.在数据库针对自增长字段创建序列(SEQUENCE),从序列获取自增值

CREATE SEQUENCE SEQ_SMART_USER_ID MINVALUE 1 MAXVALUE 999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER  CYCLE ;

随后mybatis添加数据时选取序列的下一个值作为”id”的值


		
			SELECT SEQ_SMART_USER_ID.NEXTVAL FROM DUAL
		
		INSERT INTO SMART_USER(ID, USERNAME, PASSWORD, AGE, GENDER) VALUES
		(#{id,jdbcType=DECIMAL},#{userName,jdbcType=VARCHAR},#{password,jdbcType=VARCHAR},#{age,jdbcType=DECIMAL},#{gender,jdbcType=VARCHAR})

3.创建序列(SEQUENCE)后创建触发器(TRIGGER)

CREATE SEQUENCE SEQ_SMART_USER_ID MINVALUE 1 MAXVALUE 999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER  NOCYCLE;

CREATE OR REPLACE TRIGGER SMART_USER_ID_TRG BEFORE INSERT ON SMART_USER
FOR EACH ROW
BEGIN
  SELECT SEQ_SMART_USER_ID.NEXTVAL INTO :new.id FROM DUAL
END;

随后mybatis中的语句可以和mysql的写法一致


        INSERT INTO SMART_USER(USERNAME, PASSWORD, AGE, GENDER) VALUES
        (#{userName,jdbcType=VARCHAR},#{password,jdbcType=VARCHAR},#{age,jdbcType=DECIMAL},#{gender,jdbcType=VARCHAR})

 

你可能感兴趣的:(数据库总结)