目录
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
搞定!