声明
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');