数据库---列自增长操作

一、概述

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;

 

posted @ 2020-07-17 14:09  花碎梦亦寒  阅读(877)  评论(0编辑  收藏  举报