MySQL 和 Oracle 主键自增长

声明

1)该文章整理自网上的大牛和专家无私奉献的资料,具体引用的资料请看参考文献。
2)本文仅供学术交流,非商用。如果某部分不小心侵犯了大家的利益,还望海涵,并联系博主删除。
3)博主才疏学浅,文中如有不当之处,请各位指出,共同进步,谢谢。
4)此属于第一版本,若有错误,还需继续修正与增删。还望大家多多指点。大家都共享一点点,一起为祖国科研的推进添砖加瓦。

MySQL

(1):建表

auto_increment:每插入一条数据,客户表(customers)的主键id就自动增1,如下所示

create table customers    -- 创建客户表
(
    id int auto_increment primary key not null,  -- auto_increment:自增长
    name varchar(15)
);

(2):测试(实例)

insert into customers(name) values("张三"),("李四");-- 向客户表中插入数据

select * from customers; -- 查询客户表

Oracle

(1):建表

create table student
  (
    id       number not null,  -- 主键
    name     varchar2(20),
    birthday  date, 
    age     number(20),  
    phone      varchar2(60),  
    email      varchar2(10)  
  ) 
 alter table student add constraint student_pk primary key (id); -- 主键

(2)创建序列

注:Oracle中的序列并不是和MySQL中的自增长一样,连续性的,而是跳跃、不连续性的。如要使他连续,则必须指定相关的属性和值。

/*
  --创建序列Sequence
  create sequence student_id
  minvalue 1  --最小值
  nomaxvalue  --不设置最大值(由机器决定),或 根据表字段的值范围设置 maxvalue
  maxvalue 99999999  -- 最大值
  start with 1   --从1开始计数,数值可变
  increment by 1  --每次加1,数值可变
  nocycle  --一直累加,不循环
  nocache;  --不建缓冲区。      如果建立cache那么系统将自动读取cache值个seq,这样会加快运行速度;如果在单机中使用cache,或者oracle死了,那么下次读取的seq值将不连贯,所以不建议使用cache。
 */

 -- 创建序列 
 create sequence student_id 
 minvalue 1 
 nomaxvalue --代表没有上限 
 increment by 1 
 start with 1 
 nocycle 
 nocache;

Oracle sequence序列的创建、修改及删除 详解:Oracle 序列(sequence)的创建、修改及删除

(3)创建触发器 (以下三种方式都行)

  create or replace trigger 触发器名
  before insert on 表名 for each row when (new.表的自增长字段 is null)
  begin
    select 序列名.Nextval into:new.表的自增长字段 from dual;
  end;
  -- 方式一 
  create or replace trigger tg_insertId
  before insert on student for each row when (new.id is null)  -- 当id为NULL时触发 
  begin
    select student_id.Nextval into:new.id from dual;
  end;
 
 
  -- 方式二 (我比较喜欢这种)
 create or replace trigger tg_insertId
 before insert on student for each row 
 begin
   select student_id.Nextval into:new.id from dual;
 end;


  -- 方式三
 create or replace trigger tg_insertId
    before insert on student for each row 
       declare  -- 声明
       -- 局部变量(student表里的字段)
       begin
       if updating then
          insert into student 
          values(student_id.nextval,
                 :old.name, -- 对应student表中的字段
                 :old.birthday,
                 :old.age,
          :old.phone,
          :old.email
                );
       end if;
  end;

测试(实例) 注:由于创建了触发器,所以下面的插入语句,不需要再写上id这一项


 INSERT INTO student(name,birthday,age,phone,email) 
     VALUES('zhangsan',to_date('2018-01-10 19:55:45','yyyy-MM-dd hh24:mi:ss'),18,'13510086110','123456789@qq.com');  -- 插入数据

 INSERT INTO student(name,birthday,age,phone,email) 
     VALUES('zhangsan',to_date('2018-01-11 19:55:45','yyyy-MM-dd hh24:mi:ss'),20,'13510086110','123456789@qq.com');
 

 select * from student;  -- 查询学生表
--或者

 insert into student(seq,name,birthday,age,phone,email)     -- 这是带上“自增长主键(seq)”的写法
 	 values(student_id.Nextval,'zhangsan',to_date('2018-01-10 19:55:45','yyyy-MM-dd hh24:mi:ss'),18,'13510086110','123456789@qq.com');
--案例
--建表语句
CREATE TABLE "APP"."HP_DATA"
(
    "ID"             NUMBER(11) 	NOT NULL,
    "HUB_ID"         VARCHAR2(32)   DEFAULT NULL,
    "PARAM_ID"       VARCHAR2(32)   DEFAULT NULL,
    "SV_ID"          VARCHAR2(16)   DEFAULT NULL,
    "SV_VALUE"       VARCHAR2(1024) DEFAULT NULL,
    "PRODUCT_ID"     VARCHAR2(100)  DEFAULT NULL,
    "LOT_ID"         VARCHAR2(100)  DEFAULT NULL,
    "RECIPE_ID"      VARCHAR2(100)  DEFAULT NULL,
    "STEP_ID"        VARCHAR2(100)  DEFAULT NULL,
    "CHAMBER_NUMBER" VARCHAR2(100)  DEFAULT NULL,
    "TOOL_NAME"      VARCHAR2(100)  DEFAULT NULL,
    "CREATE_TIME"    VARCHAR2(32)   DEFAULT NULL
);
--创建自增主键
alter table "APP"."HP_DATA"  add constraint HP_DATA_PK primary key (ID);

--创建对应的索引
CREATE INDEX HP_DATA_ID_IDX ON APP.HP_DATA(HUB_ID, PARAM_ID, SV_ID, SV_VALUE);

--自增语句
create sequence HP_DATA_ID
    minvalue 1
    nomaxvalue
    increment by 1
    start with 1
    nocycle
    nocache;

--触发器
create or replace trigger tg_insertId
    before insert
    on HP_DATA
    for each row
    when (new.id is null) -- 当id为NULL时触发
begin
    select HP_DATA_ID.Nextval into :new.id from dual;
end;


--删除自增语句(增加三条数据,然后删除,再增加数据会发现数据ID从4开始,清空之前的ID,需要删除自增语句,重新创建)
drop sequence HP_DATA_ID;

--插入语句
INSERT INTO APP.HP_DATA(hub_id, param_id, SV_ID, SV_VALUE, product_id, lot_id, recipe_id, step_id, chamber_number, tool_name, create_time)
VALUES ('MJHDA', '8ae48e556e351323413', '151512313', '11321', 'CQQQQQQPAI', 'DDDDDDD','CCCCCC','BS-SSSSSS', '1', 'QQQQQ', '2020-11-24 15:34:21');


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值