字段类型设为idetity。
或是在程序里控制加一。
取得新记录的编号:
select max(seg)...
或是在程序里控制加一。
取得新记录的编号:
select max(seg)...
解决方案 »
- 关于php读取数据库的内容~~
- 求助关于sql语句中多where条件的写法?
- sql server2005如何释放资源或回收?
- 判断文件是否存在?
- 三师会诊,请各位高人帮帮忙~
- 把A表数据【定位】插入到B表里去,形成新的C表
- 我们公司最近将sqlserver7换成了sqlserver2000,出现了一些问题,急
- 以前的sqlserver出了问题,后来我重装了新的实例,但启动后旧的实例仍在SQL服务管理器中,而且是第一项,请问如何去掉它......
- 关于分布式数据库技术的概念?
- 数据库无法恢复,附加!请各位大虾帮帮!!!!!!!!!
- 空值与null有啥区别?
- 急急急,SQL7,只有MDF文件,能否挽救其中的数据?
比如编号格式为YYYYMMDDXXX
select max(to_number(mid(id,9))) into tempid
from mytbl
where id like to_char(sysdate, 'yyyymmdd') || '%';
if tempid > 999 then --溢出控制
raise_application_error('编号溢出');
else
tempid := tempid + 1;
end if;
...
否则在取max(seg)之前,若有其他用户也加入新记录,取出来的是别人的 seg .
select rowid=(select rowid=count(*),datefield from mytable t1 where t1.datefield<t2.datefield) ,* from mytable t2
1。单独建一个编码资源表来保证并发访问的正确
2。利用触发器,加一个idetity,然后再建一个id列,字符型,加insert trigger 来维护id实现:0001的样子
其实上面说的都没什么不好,关键就是并发控制的问题。若不用自增加ID,在输入记录时不要生成新编号(可以生成一个新编号,但只给用户看看而已),到真正在数据库中insert 时再取max +1 生成新编号,能添加成功就可以了,若不成功可能是有其他用户抢号,可以重新取号重试一下,一般没什么问题。
不太喜欢用编号表,不好维护,编号表很容易与真实记录不一致。
@name int,@last int(10) output
AS
set nocount on
begin tran
update table1 set id_value=id_value+1 WHERE id_name =@name
SELECT @last=id_value FROM His_prm WHERE id_name =@name
commit tran
应该
CREATE PROCEDURE nextno
@name int,@last int output
AS
set nocount on
begin tran//开始锁定记录,确保取值唯一 update table1 set id_value=id_value+1 WHERE id_name =@name
SELECT @last=id_value FROM His_prm WHERE id_name =@name//结束锁定commit tran
@name int,@last int output
AS
set nocount on
begin tran//开始锁定记录,确保取值唯一 update table1 set id_value=id_value+1 WHERE id_name =@name
SELECT @last=id_value FROM table1 WHERE id_name =@name//结束锁定commit tran