往数据库中插入记录前判断是否存在 存在不插入而编辑 可有的时候还会插入 谁能给我解释解释
我在往数据库中插入或编辑一条记录前
先根据这个表中的3个字段查询这条记录是否存在 存在返回存在记录数
当存在数 大于 0的时候 编辑这行记录
当存在数 小于等于0的时候 查询这行记录
在插入或编辑数据前一步查询的
为什么有的时候在已经存在记录的情况下还会插入记录
我一个人测试的时候没问题 但是人多有的时候就会出现 因为数据库表中的3个字段内容一样的出现不只一次 (就是上面查询的3个字段)
------解决方案--------------------设主键
------解决方案--------------------3个字段 做一个联合的unique key
------解决方案--------------------用存储过程更好些,否则等你检查返回后别人可能已经插入了,表中是否有主键
------解决方案--------------------可能是并发性的问题,如果是自增主键的话,可以在插入之后返回当前值做个判断。
@@identity
------解决方案--------------------真没明白你的意思。
当存在数 大于 0的时候 编辑这行记录 //这个合理
当存在数 小于等于0的时候 查询这行记录 //小于等于0就是没记录,你查询什么?这个查询是否你写错了,应是插入?
原因在于如果同时有操作的话就会出现这个问题。你现在的处理方案是:
*把这三个字段联合设置为主键或者唯一键;
*在插入前先执行插入,如果插入不成功(返回异常),则你可以执行编辑了。
其实之所以产生这个问题是这样的,假如有两个用户A和B在不同的地方插入相同的记录。
你的插入步骤分成这样
1:查询记录数
2:判断记录个数
3:执行编辑或者插入
如果A用户执行了1,2,但没有进行插入。这时A用户的程序停顿了一下下,由B用户立刻执行这无了1,2,3步骤。这时A再执行3,就相当于把这条记录插入了两次。
如果设置了主键或者唯一键,则由数据来禁止这个重复的主键或者唯一键的插入,产生错误,你捕捉到之后就知道有这种情况发生了。
当然你还可以在程序中使用锁定来完成这个功能。
------解决方案--------------------三个字段分别是什么类型的字段?
是如何进行判断是否存在的?
------解决方案--------------------在存储过程中判断,并使用事务回滚。
------解决方案--------------------首先是3个字段完全相等作为条件查询,
select count(*) from table where a= ,b= , c=
取得count值,大于0的更新,等于0的插入。
如果遇到多人操作插入多次的问题,有2个办法,
一个是数据库的主键设置,将3个字段设置为主键与不允许重复即可
还有一个办法就要麻烦点,建一张临时表,每次查询前先看临时表里有没有相等的值,有就不插入,提示有其他用户在操作这个记录,如果没有才进行插入操作。完成后要清空本用户的使用记录。
------解决方案--------------------不知你设的关键字是那个??
------解决方案--------------------
SQL code
create proc pro
@col1 varchar(50),
@col2 varchar(50),
@col3 varchar(50)
as
begin
if exists(select 1 from 表 where col1=@col1 and col2=@col2 and col3=@col3)
select count(1) as colCount from 表
else
insert into 表(col1,col2,col3) select @col1,@col2,@col3
end