功能:sql server数字型字段转自动增量字段的方法
作者:wangsdong
来自:www.aspbc.com
原创文章,转载请保留此信息,欢迎转载。
数据库设计的时候要特别小心,不合理的数据库设计带来的麻烦太大了,我终于体会到了。
最近网站上客户发布产品老是遇到问题,经检查,找出原因:本应该一个自动增量字段,被设计成数字型的字段了,并且还是主键(不允许重复字段)。每次客户添加产品时,先要计算出最大的ProductID,然后+1,为下一条
记录做准备。以前网站流量小的时候,没有多大影响。现在在线人数很多,同时发布产品的人可能有几个。问题来了:如果有三个人同时点击发布产品,第一个人产生了一个ProductID,第二个人也产生了一个ProductID,第
三个人也产生了一个ProductID,并且三个是一样的。写入到数据库中时,第一个可以成功,其他两个失败。因为是主键,不允许重复的原因。
找了好久才找到解决办法:(将原来的数字型字段转为自动增量字段)
假设:
表Product中有三个字段Productid(数字型字段),sname,age
里面记录
insert into Product(Productid,sname,age) values(3,'张三',20) insert into Product(Productid,sname,age) values(5,'李四',21) insert into Product(Productid,sname,age) values(6,'王五',22) insert into Product(Productid,sname,age) values(8,'陈六',23)(鼠标移到代码上去,在代码的顶部会出现四个图标,第一个是查看源代码,第二个是复制代码,第三个是打印代码,第四个是帮助)
解决办法:
我先建一个表Product2,里面的字段和Product一样,但Productid是自动增量字段
表Product2中有三个字段Productid(自动增量字段),sname,age
然后使用以下语句
set identity_insert Product on insert Product2(Productid,sname,age) select Productid,sname,age from Product set identity_insert Product off(鼠标移到代码上去,在代码的顶部会出现四个图标,第一个是查看源代码,第二个是复制代码,第三个是打印代码,第四个是帮助)
这样就将Product中的所有数据导入到Product2中了
由于使用了set identity_insert Product on这个,使的Productid不变。
然后删除掉Product表(为了安全起见,改名就可以了),再将Product2表名改成Product这样就行了。
最后再去程序中将原来计算ProductId值的地方给删除就行了。
彻底解决了这个问题。