欢迎各位兄弟 发布技术文章
这里的技术是共享的
序列和表一样都是一个对象。用的时候只是从序列中取出当前的序列值,放到表中的某一列的记录中去。
如果为了唯一性上来说。只要程序控制好了,多个表用一个序列也不会重复。但是这样会导致序列的值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