数据库---列自增长操作
一、概述
1、序列(Sequence)是Oracle专有的对象,它用来产生一个自动递增的数列。
在oracle中需要完成一个列的自增操作,必须要使用序列方式。
2、MySQL中列的自增长可以使用主键auto_increment关键字
-- auto_increment:自增长 id int auto_increment primary key not null,
二、MySQL实现列自增长
-- 创建客户表 CREATE TABLE customers ( -- auto_increment:自增长 id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, username VARCHAR (20) ); -- 向客户表中插入数据,不显式的插入id INSERT INTO customers(username) VALUES("张三"),("李四"); -- 查询客户表 SELECT * FROM customers;
三、Oracle实现列自增长
3.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 );
3.2、创建序列
/* --创建序列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。 */ -- 创建学生表中的序列student_id create sequence student_id minvalue 1 maxvalue 10000 increment by 1 start with 1 nocycle nocache;
注:
1、如果想要改变start的值,必须 drop sequence 再重建一个序列
2、如果想要改变minvalue的值,必须删除序列后再重新建立序列化。不可以修改序列化的minvalue。
-- 删除一个序列 drop sequence student_id;
3.3、创建触发器
-- 创建触发器trigger /** 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 -- 当id为NULL时触发 WHEN ( new.id IS 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; -- 查all_triggers表得到trigger_name触发器名称 SELECT trigger_name FROM all_triggers WHERE table_name = 'STUDENT' -- 根据trigger_name查询出触发器详细信息 SELECT text FROM all_source WHERE TYPE='TRIGGER' AND name='TG_INSERTID'; -- 删除触发器 DROP TRIGGER [schema.]trigger_name;
3.4、测试插入数据
-- 插入学生数据(不带自增列) 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('lisi',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(ID,NAME,BIRTHDAY,AGE,PHONE,EMAIL) VALUES(STUDENT_ID.NEXTVAL,'WANGWU',TO_DATE('2018-01-10 19:55:45','YYYY-MM-DD HH24:MI:SS'),18,'13510086110','123456789@QQ.COM'); SELECT * FROM STUDENT;
四、序列的常用用法
--查看当前序列的值 select student_id.currval from dual; --获取序列的下一个值 select student_id.nextval from dual; -- 删除序列 drop sequence student_id;