一个数据库的简单问题,求高人解答

fienol 2015-02-25 05:11:54
各位都是大拿,有一个小问题想咨询一下.

如果表A ,里面有字段A1,如何控制A1的值不能大于10呢(在并发情况下),我的逻辑语法大致是这样的

declare @r int;
select @r = A1 from A where id = '1'
if(@r < 10)
update A set A1 = A1 + 1 where id = '1'


不希望直接用约束
...全文
337 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
流逝 2015-02-26
  • 打赏
  • 举报
回复
create table a
(
 id int identity,
 A1 int
)
insert a (A1)
values
(2),
(3),
(10),
(20)
select * from  a
create procedure sp_AA

@id int
as
begin
declare @r int;
 set @r=(select COUNT(*) from  a where ID=@id and A1>10);
 if @r>=1
 begin
 update a set A1=A1+1 where id=@id;
 print 1
 end 
 else
 begin 
 print 0
 end 
end
写个存储过程就可以了
唐诗三百首 2015-02-26
  • 打赏
  • 举报
回复
引用 3 楼 ap0405140 的回复:
"控制A1的值不能大于10" if(@r < 10) update A set A1 = A1 + 1 where id = '1' --> SQL语句的逻辑是小于10时A1加1,请问逻辑正确吗?
引用 10 楼 ap0405140 的回复:
[quote=引用 5 楼 fienol 的回复:] 谢谢回复.可能是我的业务没有表达清楚啊,是这样的.我需要向trans传入一个id,trans找到这个id对应的数据后,判断A1是否大于10,如果没有大于10,则A1 = A1+1,然后返回1,如果小于等于10,则返回0.
"如果没有大于10"和"如果小于等于10"这2个的逻辑有冲突喔, 如果是A1=9, 既没有大于10,也小于等于10, 请问返回什么?[/quote] 感觉LZ的业务逻辑描述很混乱喔,程序逻辑的描述必须是明确的!
唐诗三百首 2015-02-26
  • 打赏
  • 举报
回复
引用 5 楼 fienol 的回复:
谢谢回复.可能是我的业务没有表达清楚啊,是这样的.我需要向trans传入一个id,trans找到这个id对应的数据后,判断A1是否大于10,如果没有大于10,则A1 = A1+1,然后返回1,如果小于等于10,则返回0.
"如果没有大于10"和"如果小于等于10"这2个的逻辑有冲突喔, 如果是A1=9, 既没有大于10,也小于等于10, 请问返回什么?
还在加载中灬 2015-02-26
  • 打赏
  • 举报
回复
如果你没有其它的逻辑需要判断,这个UPDATE只会执行有的情况,没有的时候不会执行。
Ginnnnnnnn 2015-02-26
  • 打赏
  • 举报
回复
update A set A1 = case when A1 < 10 then A1 + 1 else A1 end where id = '1'
fienol 2015-02-26
  • 打赏
  • 举报
回复
引用 2 楼 ky_min 的回复:
update A set A1 = A1 + 1 where id = '1' AND A1<=9
直接用条件限制,貌似可以直接这样
我这个必须得先select,通过select的结果来决定是否执行update
fienol 2015-02-26
  • 打赏
  • 举报
回复
引用 4 楼 ap0405140 的回复:
"控制A1的值不能大于10" if(@r < 10) update A set A1 = A1 + 1 where id = '1' --> SQL语句的逻辑是小于10时A1加1,
大拿请参见一下5楼我的回复
fienol 2015-02-26
  • 打赏
  • 举报
回复
引用 1 楼 wmxcn2000 的回复:
可以考虑使用触发器,下面这段,是把 A1 大于 10 的,直接修改成 10

drop table A
go
create table A(id int identity , A1 int)
go
select * from A
go
create trigger A_ins
on A after insert , update 
as
begin
update A set A.A1 = 10 where A.id in (select id from inserted where A1 >10)
end
go
insert into A(A1) values(1)
insert into A(A1) values(2)
insert into A(A1) values(100)
insert into A(A1) values(101)
go
select * from A
go
id          A1
----------- -----------

(0 行受影响)

id          A1
----------- -----------
1           1
2           2
3           10
4           10

(4 行受影响)


谢谢回复.可能是我的业务没有表达清楚啊,是这样的.我需要向trans传入一个id,trans找到这个id对应的数据后,判断A1是否大于10,如果没有大于10,则A1 = A1+1,然后返回1,如果小于等于10,则返回0.
唐诗三百首 2015-02-26
  • 打赏
  • 举报
回复
"控制A1的值不能大于10" if(@r < 10) update A set A1 = A1 + 1 where id = '1' --> SQL语句的逻辑是小于10时A1加1,
唐诗三百首 2015-02-26
  • 打赏
  • 举报
回复
"控制A1的值不能大于10" if(@r < 10) update A set A1 = A1 + 1 where id = '1' --> SQL语句的逻辑是小于10时A1加1,请问逻辑正确吗?
还在加载中灬 2015-02-26
  • 打赏
  • 举报
回复
update A set A1 = A1 + 1 where id = '1' AND A1<=9
直接用条件限制,貌似可以直接这样
卖水果的net 版主 2015-02-26
  • 打赏
  • 举报
回复
可以考虑使用触发器,下面这段,是把 A1 大于 10 的,直接修改成 10

drop table A
go
create table A(id int identity , A1 int)
go
select * from A
go
create trigger A_ins
on A after insert , update 
as
begin
update A set A.A1 = 10 where A.id in (select id from inserted where A1 >10)
end
go
insert into A(A1) values(1)
insert into A(A1) values(2)
insert into A(A1) values(100)
insert into A(A1) values(101)
go
select * from A
go
id          A1
----------- -----------

(0 行受影响)

id          A1
----------- -----------
1           1
2           2
3           10
4           10

(4 行受影响)


wula0010 2015-02-26
  • 打赏
  • 举报
回复
引用 楼主 fienol 的回复:
各位都是大拿,有一个小问题想咨询一下. 如果表A ,里面有字段A1,如何控制A1的值不能大于10呢(在并发情况下),我的逻辑语法大致是这样的 declare @r int; select @r = A1 from A where id = '1' if(@r < 10) update A set A1 = A1 + 1 where id = '1' 不希望直接用约束
什么东西就干什么事情,控制A1的值不能大于10,是数据库该干的事情么?这个是业务逻辑里面的事情,不该数据库来干,.......................
唐诗三百首 2015-02-26
  • 打赏
  • 举报
回复
引用 18 楼 fienol 的回复:
最简单的确是用约束,保证了数据的上限. 主要原因是要有返回值,这个返回值要说明是否更改过.
用try..catch..括住update A1+1的语句,若违反约束会报错,报错信息会被catch,然后再catch段里控制返回值.
还在加载中灬 2015-02-26
  • 打赏
  • 举报
回复
直接执行,在执行语句上加条件,满足的才会执行,你程序有其它判断时,可以根据影响行数处理
fienol 2015-02-26
  • 打赏
  • 举报
回复
引用 16 楼 ap0405140 的回复:
最简单的方法就是用约束,请问不用约束的原因?
最简单的确是用约束,保证了数据的上限. 主要原因是要有返回值,这个返回值要说明是否更改过.
fienol 2015-02-26
  • 打赏
  • 举报
回复
引用 15 楼 ky_min 的回复:
你有其它的逻辑需要处理吗?要保证并发正确性,语句用单一的完整的单个语句不是很好吗? 为什么还非得拆成两句,还先SELECT~~ 你要嘛加事务加锁,要嘛直接只对小于等于9的数据执行UPDATE,这样再大的并发也不会加到10去
你的思路是不是直接update,然后根据是否有行受到影响,来返回0或者1
唐诗三百首 2015-02-26
  • 打赏
  • 举报
回复
最简单的方法就是用约束,请问不用约束的原因?
还在加载中灬 2015-02-26
  • 打赏
  • 举报
回复
你有其它的逻辑需要处理吗?要保证并发正确性,语句用单一的完整的单个语句不是很好吗? 为什么还非得拆成两句,还先SELECT~~ 你要嘛加事务加锁,要嘛直接只对小于等于9的数据执行UPDATE,这样再大的并发也不会加到10去
fienol 2015-02-26
  • 打赏
  • 举报
回复
引用 12 楼 heshuyu001a 的回复:
create table a
(
 id int identity,
 A1 int
)
insert a (A1)
values
(2),
(3),
(10),
(20)
select * from  a
create procedure sp_AA

@id int
as
begin
declare @r int;
 set @r=(select COUNT(*) from  a where ID=@id and A1>10);
 if @r>=1
 begin
 update a set A1=A1+1 where id=@id;
 print 1
 end 
 else
 begin 
 print 0
 end 
end
写个存储过程就可以了
谢谢答复. 但是我这个是要保证+1以后永远<=10,如果>10了,就不加了
加载更多回复(1)

34,594

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧