如何使保存的记录的主键字段的值唯一?高手请进,常见问题
现有一个表,假设主键字段为BookID,它需要保持唯一性,但不知道是不是有比较好的方法?
我是想每次在保存前取表记录中BOOKID的最大号加1,但是现在有大约800个用户在不停的向这个表中插入记录,每插一条的bookID 都是取最大号加一,但是因为用户都同时在插入记录,想知道如何能使用记录顺利保存,而不返回‘违反约束。。。。’等字样,并且不想后客户端弹出对话框让用户重新保存或重试?
问题点数:50、回复次数:20Top
1 楼gsoft(xiaoxiao)回复于 2004-12-04 19:56:02 得分 0
helpTop
2 楼gsoft(xiaoxiao)回复于 2004-12-04 19:56:29 得分 0
help me ....Top
3 楼gsoft(xiaoxiao)回复于 2004-12-04 19:58:38 得分 0
helpTop
4 楼hsmserver(撒哈拉之雨的悲伤)回复于 2004-12-04 20:03:07 得分 7
在更新数据的时候锁定表Top
5 楼gsoft(xiaoxiao)回复于 2004-12-04 20:09:24 得分 0
那不行,一锁,别人就会存不进去的,不可以,800多用户,一锁哪怕0.01秒,也可能有很多用户在保存而无法保存。。。Top
6 楼Rail100(杀神之狙)(能忘掉结果,未能忘记遇上)回复于 2004-12-04 20:58:51 得分 7
MS SQL SERVER 2000:
如果只是本表唯一,用IDENTITY屬性定義該列,如果要在整個數據庫唯一,用ROWGUIDCOL屬性Top
7 楼gsoft(xiaoxiao)回复于 2004-12-04 21:58:22 得分 0
如果用identity属性,在我插入记录后,如何取得刚才插入的记录的identity值Top
8 楼gsoft(xiaoxiao)回复于 2004-12-04 22:04:18 得分 0
现在又遇到一个新的问题,我如何取得我刚插入表中的那条记录的自增值呢,
比如:我插入一条记录:自增值为10001
插入后,我想得到我刚插入的这条记录的自增值10001,这个值如何取得
Top
9 楼madbo(风轻扬{十年磨一剑})回复于 2004-12-04 22:13:32 得分 10
提个建议。
考虑换个角度。不同时让800个用户进行数据库操作,而是把他们的数据存入自定义数组里。
这样数据库操作的时候就每次处理一条数据,速度也不是很慢,对于800条记录应该没问题的。
Top
10 楼gsoft(xiaoxiao)回复于 2004-12-04 22:31:12 得分 0
to madbo
楼上说的我不太明白,能否详细说说。
我的实际情况是这样,我的表中有一个字段是blob字段,一般可能保存文件的大小为10M以下,我现在的做法是先把非blob字段的值保存到数据库,接着再对这条记录编辑,把blob字段的内容保存到数据库中,你说的方法对这的要求可行不?Top
11 楼OverlordBlind(OverlordBlind)回复于 2004-12-04 22:39:50 得分 2
楼主的程序由服务器端吗?还是客户端自己往SQL2000里添数据?Top
12 楼gsoft(xiaoxiao)回复于 2004-12-04 23:00:34 得分 0
我的程序是cs结构的,数据服务端为oracle
客户端大约1000多台pc,同时使用的用户大约800多
用户从客户端向oracle中插入数据
Top
13 楼OverlordBlind(OverlordBlind)回复于 2004-12-04 23:14:37 得分 10
为了防止并发访问,自己作一个Server为客户端的请求排序吧,像madbo(风轻扬)说得那样
Oracle
|
Server
|||
__ | _____
| | |
Client1 Client2 Client3...Top
14 楼gsoft(xiaoxiao)回复于 2004-12-04 23:28:16 得分 0
明白谢谢
请问oracle中的行锁如何解锁?用什么命令?Top
15 楼OverlordBlind(OverlordBlind)回复于 2004-12-04 23:31:59 得分 2
$%%@#$^&*&&^*$
呵呵,Oracle俺不会Top
16 楼prosimon(西蒙)回复于 2004-12-05 09:20:31 得分 2
果真是个比较复杂的问题 关注中Top
17 楼gsoft(xiaoxiao)回复于 2004-12-05 09:56:27 得分 0
如果用加锁,那么应该怎么做,象下面这样吗
lock table mytable in row mode
insert .........
commit
Top
18 楼gsoft(xiaoxiao)回复于 2004-12-05 09:57:19 得分 0
commit相当于解锁,是吗?
commit后就自动解锁刚才锁住的行吗Top
19 楼madbo(风轻扬{十年磨一剑})回复于 2004-12-05 12:02:03 得分 10
to 楼主:
呵呵,报歉,昨天贪睡了点,看来我提的建议您已经理解了。
oracle俺还没研究过,帮不上更大的忙了,深表遗憾……
to OverlordBlind(OverlordBlind)
谢谢兄弟画图解说,还请多多指教!Top
20 楼gsoft(xiaoxiao)回复于 2004-12-05 14:46:42 得分 0
谢谢大家,
在oracle中,我刚才启动了两个sql plus worksheet,为说明方便,我们分别给它们叫做A sqlplus,B sqlplus
第一步:A,B都运行下面语句
insert into tbl_book(bookid, bookname) values(bid.nextval, 'bookname');
select bid.currval from dual;
commit;
运行完之后A的currval当前值为100,B的currval当前值为101
第二步:
A的语句保持不变
B的语句删除insert语句即变为select bid.currval from dual;
第三步:
先执行A中的语句,currval的前变为102
再执行B中的语句,currval的值还是101
为什么为什么B中的currval值不是102
Top




