欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

oracle数据库主键问题-小白上路

程序员文章站 2022-03-03 20:02:25
...

1. 主键问题

mysql可以通过auto_increment 设置自增,但是oracle需要通过序列、触发器来实现。

1.1 MySQL

CREATE TABLE `DEPENDENCY_LOG` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `userid` varchar(255) DEFAULT NULL COMMENT '操作者id',
   `modulename` varchar(255) NOT NULL COMMENT '依赖名称',
   `version` varchar(255) DEFAULT NULL COMMENT '版本号',
   `type` varchar(255) DEFAULT NULL COMMENT '操作类型,删除,添加,更新',
   `details` varchar(255) DEFAULT NULL COMMENT '详情',
   `status` int(1) DEFAULT NULL COMMENT '修改状态(1成功 0失败)',
   `time` datetime DEFAULT NULL COMMENT '修改时间',
   PRIMARY KEY (`id`)
 ) ENGINE=InnoDB AUTO_INCREMENT=98 DEFAULT CHARSET=utf8

1.2 Oracle

CREATE TABLE "ABX01"."DEPENDENCY_LOG" (
  "ID" NUMBER(11,0) DEFAULT 1 NOT NULL,
  "USERNAME" NVARCHAR2(255),
  "MODULENAME" NVARCHAR2(255) NOT NULL,
  "VERSION" NVARCHAR2(255),
  "TYPE" NVARCHAR2(255),
  "DETAILS" NVARCHAR2(255),
  "STATUS" NUMBER(11,0),
  "TIME" DATE
)

2. 如何解决

2.1 设置序列

CREATE SEQUENCE sq_log    
    INCREMENT BY 1 -- 每次加几个  
    START WITH 0 -- 迁移过来的,已经有记录了  
    MINVALUE 1      --最小值1  
    NOMAXVALUE -- 不设置最大值   
    NOCYCLE -- 一直累加,不循环  
    NOCACHE -- 不建缓冲区  

2.2 设置触发器

 CREATE OR REPLACE TRIGGER tri_log
           BEFORE INSERT ON "DEPENDENCY_LOG" --表名
           FOR EACH ROW  
           BEGIN  
		    SELECT sq_log.nextval into :new.自增的ID  from dual;  
		   END tri_log;  

建立序列和触发器,在表中设置id自动增长,一般一个用一个序列,如果多个表公用一个,那么id会分布到各个表中.