oracle创建表,序列,触发器,自动生成唯一主键

数据库oracle和mysql插入数据的区别?

mysql数据库主键字段是increament,则插入数据不需要插入主键字段。数据库会自动生成主键

oracle数据库主键字段必须创建序列,则插入数据必须插入主键字段。数据库根据序列自动生成主键

那么如何让oracle数据库插入数据像mysql一样实现主键自增呢?解决方法是:序列+触发器


案例:

plsql图示:

1.创建表:



2.创建序列:



3.创建触发器:



sql实现:

1.创建表

-- Create table
create table SJK_BAR_CODE
(
  id          NUMBER(12) not null,
  rule        VARCHAR2(255),
  esp_no      VARCHAR2(100),
  table_name  VARCHAR2(10),
  esp_id      NUMBER(12),
  is_del      NUMBER(1),
  create_time DATE,
  update_time DATE,
  esp_content VARCHAR2(100)
)

tablespace USERS
  pctfree 10
  initrans 1
  maxtrans 255
  storage
  (
    initial 64K
    minextents 1
    maxextents unlimited
  );

-- Add comments to the columns 
comment on column SJK_BAR_CODE.is_del
  is '1:否,2:是';
comment on column SJK_BAR_CODE.esp_content
  is '档案内容';

-- Create/Recreate primary, unique and foreign key constraints 
alter table SJK_BAR_CODE
  add constraint PK_BAR_CODE primary key (ID)
  using index 
  tablespace USERS
  pctfree 10
  initrans 2
  maxtrans 255
  storage
  (
    initial 64K
    minextents 1
    maxextents unlimited
  );


2.创建序列

-- Create sequence 
create sequence BAR_CODE_SEQUENCE
minvalue 1
maxvalue 999999999999999999999999999
start with 1
increment by 1
cache 20;


备注:

minvalue 1          -----最小值
maxvalue 9999999999999999999999999999 ------最大值
increment by 1     -----每次加几个
start with 1           -----从几开始
cache 20             -----缓存值多少
noorder               -----一直累加,不排序
nocycle ;              --一直累加不循环


3.创建触发器

CREATE OR REPLACE TRIGGER  BAR_CODE_TG 
before insert on SJK_BAR_CODE for each row 
begin 
  select BAR_CODE_SEQUENCE.nextval into :new.ID from dual; 
end;


4.插入记录

INSERT INTO SJK_BAR_CODE(rule,esp_no)VALUES ('00-100-2016-0013','100')


5.查询记录

select * from SJK_BAR_CODE

查询结果集:



到此这里发现插入数据主键自动递增,实现像mysql一样的小若。


总结:

1.在实际开发中,具体情况具体分析,也不一定都要创建触发器。

2.若是没有创建触发器,只创建了序列,则插入数据必须插入主键id,主键id值为序列如:

<insert id="addSonDeptOp" parameterType="com.suwei.sysMng.bean.PtDept">
    insert into
    PT_DEPT(DEPT_ID,DEPT_NAME,DEPT_LNAME,DEPT_CODE,DEPT_ADDR,DEPT_PHONE,DEPT_TYPE,DEPT_LEVEL,DEPT_MANAGER,USE_FLAG,FDEPT_ID)
    values(PT_SEQ.nextval,#{deptName},#{deptLname},#{deptCode},#{deptAddr},#{deptPhone},#{deptType},#{deptLevel},#{deptManager},#{useFlag},#{fdeptId})
</insert>
3.oracle查询所有序列

select * from all_sequences

结果图:


4.oracle查询当前用户所有序列(常用)

select * from user_sequences
结果图:


5.oracle查询所有触发器

select object_name from dba_objects where object_type='TRIGGER'
结果图:


6.oracle普通用户的权限查询所有触发器

select  name  from  user_source  where  type='TRIGGER'  group  by name


查询显示所有列:select * from user_source where type='TRIGGER'

7.oracle查询当用用户的所有触发器

如当前oracle用户名"SJKNEW"

则:

select object_name from dba_objects where object_type='TRIGGER' and  owner='SJKNEW'
8.oracle查询某个触发器具体详细信息

如触发器名称"BAR_CODE_TG"

select text from user_source where type='TRIGGER' and name='BAR_CODE_TG'; 
9.oracle注意查询字段区分大小写,如上诉默认的触发器名称均是大写,若是换成小写则查询为空












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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值