欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

oracle sequence 序列 用于多张表 有大用

oracle 多张表可以都用一个序列吗


序列和表一样都是一个对象。用的时候只是从序列中取出当前的序列值,放到表中的某一列的记录中去。
如果为了唯一性上来说。只要程序控制好了,多个表用一个序列也不会重复。但是这样会导致序列的值1,2,3,4,。。。n,是分散在所有你用的表中的,而不是每个表都从1开始到n
这样说不知道你明白不。
序列和表是独立的关系。
建议一张表的一个主键对应一个序列。


来自 https://zhidao.baidu.com/question/1989421435413598747.html


前几天在创建数据表时,想偷个懒,使用一个序列给两个表创建主键自增功能,结果。。。。。。

情景:

为宠物中心创建一个简单的数据库,要求如下:
1.创建一个主人表,字段:主人编号,主人姓名,主人性别,主人联系方式,宠物编号...
2.创建一个宠物表,字段:宠物编号,宠物昵称,宠物种类...
3.主人表和宠物表是一一对应关系,要求主人id和宠物id一致


创建的SQL语句如下:

我们先不创建主外键关系,一起看看一个序列给两个表创建主键自增功能的结果。

--Oracle中用一个序列给两个表创建主键自增功能的后果

--1.创建测试表:_host(主人信息),t_pet(宠物信息)
create table t_host(h_id number(4) primary key,h_name varchar2(20),h_sex varchar2(20),telephone number(11),p_id number(4));

create table t_pet(p_id number(4) primary key,p_name varchar2(20),p_category varchar2(20));e


--2.创建序列
create sequence seq_host_pet;


--3.给表t_host,t_pet创建主键自增功能
create or replace trigger trigger_host 
before insert on t_host
referencing new as newhost
for each row
begin
    if :newhost.h_id is null then
     :newhost.h_id :=seq_host_pet.nextval;
    end if;
end;
/

create or replace trigger trigger_pet 
before insert on t_pet
referencing new as newpet
for each row
begin
    if :newpet.p_id is null then
     :newpet.p_id :=seq_host_pet.nextval;
    end if;
end;
/


-- 3.向表t_host,t_pet依次逐一插入如下数据(同时插入主人和宠物信息)
insert into t_host(h_name,h_sex) values('scott','man',123456789);
insert into t_pet(p_name,p_category) values('小黄','dog');
insert into t_host(h_name,h_sex) values ('zhao','man',123456789);
insert into t_pet(p_name,p_category) values('溜溜','dog');
insert into t_host(h_name,h_sex) values ('qian','feman',123456789);
insert into t_pet(p_name,p_category) values('佳佳','cat');


结果如下:

这里写图片描述

这里写图片描述

我们可以看到两个表的id,因为依次逐一插入的关系,恰好是错开的。即是两个表共用一个不重复序列,两个表才id是不可能重复的。

若想实现宠物id和主人id一致,必须创建两个序列


来自 https://blog.csdn.net/baidu_37107022/article/details/74853437


普通分类: