要求是这样的:我的表的主键(cid)是char8 类型的 具体格式是 30200001 也就是302是固定的 后面是一个序列好
这种情况下我在程序中每插入一条数据都要 select max(cid) from 表名 ;然后再把前面的302截取掉,在把后面的序列转化成number型 再加上1然后再toString(),还有判断是否够8位,如果不够的话中间补0 ,用着特别复杂,还效率低下。
各位大哥看看有其他的办法没有?
我的想法是能不能写一个sql语句直接返回下一个要添加的cid 我在程序中就方便多了,
小弟在此谢过了……
[b]问题补充:[/b]
大哥,可不可以提供个示例呀?
[b]问题补充:[/b]
数据库设计的缺陷,这个我也知道,因为这个数据库是别人设计的,我这边没法改变,pJun (中级程序员)大哥说的很有道理,可是这样也会有一种问题的产生,就是当cid(后面那部分)的值没有达到5位数时,还要判断一次,也就是还要去补零呀!这个问题怎么解决呀?
谢谢各位了……
如果是sql server 2000的话,我认为可以这样,select convert(int,max(cid))+1 from 表名,这样直接得到下一个,如果是其他数据库,找到字符转整形的函数就行,不过你这个表,只能存储99999条数据,是不是太少了?
如果你sql语句不是很熟的话,建议你直接用企业管理器来建,这样避免出错,业余时间多看看sql语句的基础知识。
实在应当用代理主键,不要用业务上面的唯一来表示主键,在设计上面都会灵活一点。
LZ楼上的代理主键无法解决你的问题,个人认为造成这个问题的原因是你的数据库设计不合理.
我给你个建议把Cid拆分成两个字段 prefix_cid 和cid .其中prefix存储302,cid设置成自增主键.取出的时很按照你的条件拼接就OK了.
望有用! :D
如果这条路必须走到黑的话,那就把整个这个操作写出一个存储过程好了,把你在Java代码里面写的东西全部写到存储过程中.
具体怎么写,Google学习下.偶也不会!~
用存储过过程,考虑一下你的代码的可移植性。如果非要用它来做主键,从设计模式上,建议是把生成主键的写成一个类,考虑一下HIBERNATE的主键生成策略。
将ID再搞一下,把ID的递增管理放到另一个表去。
create table t_id(table_name varchar(30),next_id int,cache_size int)
取ID的时候从这个表取,更新维护都在这里。
cid只是根据前面得到的值构造然后设值。
有一个小问题是,可能不连续,处理起来略麻烦。