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

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
)

1.3 如何解决

1.3.1 设置序列

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

1.3.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会分布到各个表中.

2. declare语句块

declare 
  age number(4);--声明一个参数 age 类型为 number类型 长度为4
begin
  select teaAge into age from teacher where teaid = 122; --查询 teaid为122的teaAge 把teaAge的值放到age中
  if age>24 then  --当age的值大于24
dbms_output.put_line('da'); --就在控制台输出da   dbms_output 是一个系统包 调用了包里面的put_line函数
  else
dbms_output.put_line('xiao');--如果小于24 输出 xiao
  end if;--结束if语句
end; --结束这个程序

declare i number;
--for实现
begin
for i in 1 .. 26 loop
insert into T_ROLE_GROUP_PERMISSION(ROLE_ID,GROUP_PERMISSION_ID)
values(1,i);
end loop;
end;

遇到的问题

1 Caused by: java.sql.SQLException: ORA-01407: 无法更新 (“ABXMANAGE”.“T_USER”.“DEPARTMENT”) 为 NULL

在这里插入图片描述

1.1 问题原因

数据库的表字段设置了非空约束

1.2 解决

搜索该表存在的所有约束(department的约束我已经删除,这里以其他字段替代)

SELECT *
FROM user_constraints
WHERE table_name = 'T_USER';

在这里插入图片描述
删除该字段对应的约束

ALTER TABLE T_USER DROP CONSTRAINT SYS_C0053854

搞定!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值