浏览 3930 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2012-09-19
在mysql中,实现字段自增,只用给他设置为auto_increase就ok了
这是简单的傻子啊(但是多数据库共享,分布式计算就不适用了,呵呵)
在oracle中没有这样便捷的功能,所以只能用sequence加trigger来解决这个问题
以下是一个Demo: 创建sequence
-- create sequence of id of the table sql_template_set create sequence sql_template_id_seq increment by 1 start with 60 nomaxvalue nominvalue nocache;
创建表 sql_template_set (id为主键,并且为自增字段) create table SQL_TEMPLATE_SET ( SENTENCE VARCHAR2(2000), TEMPLATESQL VARCHAR2(300), TABLEIDS VARCHAR2(100), ID NUMBER(6) not null ) alter table SQL_TEMPLATE_SET add constraint TEMPLATE_ID primary key (ID)
创建触发器,在insert数据之前,添加id的值 -- 创建自增触发器 create or replace trigger sql_template_con_tri before insert on sql_template_set for each row begin -- 设置sql主键自增 select sql_template_id_seq.nextval into :new.id from dual; end;
完毕,现在可以测试一下下 -- 测试表trigger insert into sql_template_set(sentence,templatesql,tableids) values('dirktest','dirktest','dirktest') commit; 结果主键id就从60开始,每加条数据递增1
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2012-09-19
序列的嘛
|
|
返回顶楼 | |
发表时间:2012-09-20
问题是
还是需要一次查询才能拿回主键 而且这次查询怎么写呢? |
|
返回顶楼 | |
发表时间:2012-09-20
最后修改:2012-09-20
jinnianshilongnian 写道 问题是
还是需要一次查询才能拿回主键 而且这次查询怎么写呢? 确实有这个问题。 可是我觉得要是非要让嵌入式语言(如java)知道主键的话,或是非要根据主键查询可以用类似java的uuid,但是这样就不是递增的了,只能做到数据库(包括分布式情况)中表的唯一性。 但是大多情况,至少在做数据统计的时候的大多数情况下,id都无需知道滴,还是能用这个滴 |
|
返回顶楼 | |
发表时间:2012-09-20
insert into sql_template_set(id,sentence,templatesql,tableids) values(sql_template_id_seq.nextval,'dirktest','dirktest','dirktest')
这么写好像也可以。。。 |
|
返回顶楼 | |
发表时间:2012-09-20
blackproof 写道 jinnianshilongnian 写道 问题是
还是需要一次查询才能拿回主键 而且这次查询怎么写呢? 确实有这个问题。 可是我觉得要是非要让嵌入式语言(如java)知道主键的话,或是非要根据主键查询可以用类似java的uuid,但是这样就不是递增的了,只能做到数据库(包括分布式情况)中表的唯一性。 但是大多情况,至少在做数据统计的时候的大多数情况下,id都无需知道滴,还是能用这个滴 还有几点: 1、比如mysql的自增 当人工赋值了 那么自增是不起作用的; 2、如果触发器全局通用 那非常好, 但现在不是,即实际成本高于直接写seq.nextval |
|
返回顶楼 | |
发表时间:2012-09-20
tenderuser 写道 insert into sql_template_set(id,sentence,templatesql,tableids) values(sql_template_id_seq.nextval,'dirktest','dirktest','dirktest')
这么写好像也可以。。。 嗯,是滴 可是这里的目的是模仿auto_increment的功能,你这样还要知道这个sequence,不过的确少了trigger的开销,滴。 |
|
返回顶楼 | |
发表时间:2012-09-20
jinnianshilongnian 写道 blackproof 写道 jinnianshilongnian 写道 问题是
还是需要一次查询才能拿回主键 而且这次查询怎么写呢? 确实有这个问题。 可是我觉得要是非要让嵌入式语言(如java)知道主键的话,或是非要根据主键查询可以用类似java的uuid,但是这样就不是递增的了,只能做到数据库(包括分布式情况)中表的唯一性。 但是大多情况,至少在做数据统计的时候的大多数情况下,id都无需知道滴,还是能用这个滴 还有几点: 1、比如mysql的自增 当人工赋值了 那么自增是不起作用的; 2、如果触发器全局通用 那非常好, 但现在不是,即实际成本高于直接写seq.nextval 嗯,这我倒是没想到,可能也是应为现在的业务没碰到 的确应该在trigger中判断一下:new.id is null or :new.id = '',然后再赋值。 至于触发器全局可是使用到全局中滴,只要加实例名就可以了滴。 还有至于trigger的成本,的确是高了些。 其实也想过,直接用过程,在过程里,生成id值,再插入。java那些语言就直接调用过程了。 |
|
返回顶楼 | |