像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.表结构
#创建Oracle数据库表所遇到的问题 - 2.表里面的数据
#创建Oracle数据库表所遇到的问题 - 3.插入的数据
#创建Oracle数据库表所遇到的问题
请注意我的SQL语句!说着说着坑就来了~“orgid” 是用双引号引用起来的。。。,为什么说,id是从5开始的? 因为,我以前插入过四条数据。。。哈哈哈,有问题[email protected]交流