#创建Oracle数据库表所遇到的问题

像mysql一样设置主键自增

这个问题说真的真的是给我卡住了,处于各种懵逼状态!由于以前公司用的数据库都是mysql以为直接Auto_Increment 就可以了~设置主键自增,结果可想而知!!! 真的是太惨了,耽误了自己很长时间才把这个问题解决,而且,由于用的数据库是Navcat Premium,这个工具也导致踩了一个大坑!!!下面来记录下这个问题


	CREATE TABLE "HTD_BOSS"."Z_PULL_NEW_INTEGRAL" (
	"id" NUMBER ( 11, 0 ) NOT NULL ENABLE,
	"orgid" NUMBER ( 11, 0 ) NOT NULL ENABLE,
	"memberno" NUMBER ( 11, 0 ) NOT NULL ENABLE,
	"pullno" NUMBER ( 11, 0 ) NOT NULL ENABLE,
	"pulltime" DATE NOT NULL ENABLE,
	"pulltype" NUMBER NOT NULL ENABLE,
	"integralnumber" NUMBER ( 11, 0 ) NOT NULL ENABLE,
	"integraltype" NUMBER ( 11, 0 ) NOT NULL ENABLE,
	"createtime" DATE NOT NULL ENABLE 
	)
	
	-- 添加表注释
	COMMENT ON table Z_PULL_NEW_INTEGRAL IS '拉新积分详情表';
	
	-- 添加字段注释
	comment on column Z_PULL_NEW_INTEGRAL."id" is '唯一主键ID';
	comment on column Z_PULL_NEW_INTEGRAL."orgid" is '门店ID';
	comment on column Z_PULL_NEW_INTEGRAL."memberno" is '会员ID';
	
	comment on column Z_PULL_NEW_INTEGRAL."pullno" is '被拉新人ID';
	comment on column Z_PULL_NEW_INTEGRAL."pulltime" is '拉新时间';
	comment on column Z_PULL_NEW_INTEGRAL."pulltype" is '拉新类型';
	
	comment on column Z_PULL_NEW_INTEGRAL."integralnumber" is '本次拉新获取积分数量';
	comment on column Z_PULL_NEW_INTEGRAL."integraltype" is '积分获取类型 1.签到 2.拉新 3.普通购买商品 4.阶梯团 5.定金团 6. 拼团';
	comment on column Z_PULL_NEW_INTEGRAL."createtime" is '本条拉新记录创建时间';

Oracle跟Mysql不一样不能够设置主键自增

oracle不能实现字段数值的自增长。可以通过序列和触发器来实现一行数据在insert前实现某字段的自增。,所以试图使用auto_increment的少年~跟我一样,还是清醒下吧!!!

下面,我们通过序列和触发器来实现这一个骚包操作!!!

  • 1.创建一个序列
1)首先建立一个序列(就是每次查询会自动增加值的绝不重复的对象,比如每次加1或每次加10)。语法:

CREATE SEQUENCE 序列名

[INCREMENT BY n]     --每次加几

[START WITH n]         --序列从几开始

[{MAXVALUE/ MINVALUE n|NOMAXVALUE}] --最小值、最大值的限制



  例如:create sequence Z_PULL_NEW_INTEGRAL_ID start with 1 increment by 1; 就是建立了额一个从1开始每次加1
的序列。访问序列时,用  序列名称.nextval的语法。

  查询自己的出发去,记得用下面你的语句:select sequence_name from user_sequences

效果如图所示:

  • 2.创建触发器

create or replace trigger Z_PULL_NEW_INTEGRAL_trigger
       before insert on Z_PULL_NEW_INTEGRAL
       for each row
         when(new."id" is null)
         begin
           select Z_PULL_NEW_INTEGRAL_ID.nextval into:NEW."id" from dual;
         end;

触发器的意思是: 再插入Z_PULL_NEW_INTEGRAL表之前先去查询一下当前表的下一个id是否为null如果为null的话,那么就会将序列的下一个值插入到id字段中

下面我们来说一下用Navcat Premium的大坑!

由于一开始我使用的是可视化建表,而不是传统的命令行建表,就导致了我创建的表示这个样子的:


	CREATE TABLE "HTD_BOSS"."Z_PULL_NEW_INTEGRAL" (
	"id" NUMBER ( 11, 0 ) NOT NULL ENABLE,
	"orgid" NUMBER ( 11, 0 ) NOT NULL ENABLE,
	"memberno" NUMBER ( 11, 0 ) NOT NULL ENABLE,
	"pullno" NUMBER ( 11, 0 ) NOT NULL ENABLE,
	"pulltime" DATE NOT NULL ENABLE,
	"pulltype" NUMBER NOT NULL ENABLE,
	"integralnumber" NUMBER ( 11, 0 ) NOT NULL ENABLE,
	"integraltype" NUMBER ( 11, 0 ) NOT NULL ENABLE,
	"createtime" DATE NOT NULL ENABLE 
	)

表名以及字段名都有双引号-------> 双引号的原因是Oracle数据库区分大小写,当你没有用双引号引起来的时候,他会默认转换为大写,当你用双引号引用起来的时候就区分大小写,所以我们在引用字段的时候需要加上双引号,这个是一个大坑,大家需要谨记!!!

下面我们来展示效果

  • 1.表结构

  • 2.表里面的数据

  • 3.插入的数据

请注意我的SQL语句!说着说着坑就来了~“orgid” 是用双引号引用起来的。。。,为什么说,id是从5开始的? 因为,我以前插入过四条数据。。。哈哈哈,有问题[email protected]交流

发布了32 篇原创文章 · 获赞 26 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_27416233/article/details/90406662