zoukankan      html  css  js  c++  java
  • 数据库---列自增长操作

    一、概述

    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;
  • 相关阅读:
    C# DateTimePicker控件详解
    python2.7虚拟环境virtualenv安装及使用
    Python2.7 安装numpy报错解决方法
    关于C语言中递归的一点点小问题
    Drozer--AndroidApp安全评估工具
    Android--native层so文件调试
    New Blog
    小旭讲解 LeetCode 53. Maximum Subarray 动态规划 分治策略
    2017年度回忆与总结 – 心态
    基于文本图形(ncurses)的文本搜索工具 ncgrep
  • 原文地址:https://www.cnblogs.com/han-sun/p/13329648.html
Copyright © 2011-2022 走看看