Sql 为更新中的int指定上限
给定一个表,例如Article(Id,Body,Revisions),我想增加Revisions属性,一旦达到某个限制(这是开发人员提供的常量),就会抛出一个错误。这是否可以通过一次更新实现。。。T-SQL中的SET语句 我所做的:Sql 为更新中的int指定上限,sql,sql-server,entity-framework,tsql,Sql,Sql Server,Entity Framework,Tsql,给定一个表,例如Article(Id,Body,Revisions),我想增加Revisions属性,一旦达到某个限制(这是开发人员提供的常量),就会抛出一个错误。这是否可以通过一次更新实现。。。T-SQL中的SET语句 我所做的: 要按1递增修订属性,我解决了如下问题: 问题 找到一种线程安全的方法,允许增加修订,直到达到某个上限 上下文 由于我使用EF,理想的解决方案是抛出错误或指定某种标志。我正在使用的代码(如下所示)被封装到一个try-catch中: context.Datab
- 要按1递增修订属性,我解决了如下问题:
- 找到一种线程安全的方法,允许增加修订,直到达到某个上限
context.Database.ExecuteSqlCommand("UPDATE dbo.Articles SET Revisions = Revisions + 1 WHERE Id=@p0;", articleId);
如果限值是100
UPDATE Article
SET Revisions = LEAST(Revisions + 1, 100)
where Id = @p0
如果限值是100
UPDATE Article
SET Revisions = LEAST(Revisions + 1, 100)
where Id = @p0
使用检查约束。update语句不能违反由CHECK约束实现的边界。甚至连睡眠剥夺DBA在控制台发出的update语句都没有
create table article (
id integer primary key,
body nvarchar(max) not null,
-- Allow six versions. (Original plus five revisions.)
revisions integer not null
check (revisions between 0 and 5)
);
insert into article values (1, 'a', 0);
update article
set body = 'b', revisions = 1
where id = 1;
update article
set body = 'c', revisions = 2
where id = 1;
-- Other updates . . .
-- This update will *always* fail with an error.
update article
set body = 'f', revisions = 6
where id = 1;
使用检查约束。update语句不能违反由CHECK约束实现的边界。甚至连睡眠剥夺DBA在控制台发出的update语句都没有
create table article (
id integer primary key,
body nvarchar(max) not null,
-- Allow six versions. (Original plus five revisions.)
revisions integer not null
check (revisions between 0 and 5)
);
insert into article values (1, 'a', 0);
update article
set body = 'b', revisions = 1
where id = 1;
update article
set body = 'c', revisions = 2
where id = 1;
-- Other updates . . .
-- This update will *always* fail with an error.
update article
set body = 'f', revisions = 6
where id = 1;
您可以在
UPDATE
语句中使用WHERE
子句来完成此操作,这将完成测试。如果测试失败,更新将不会发生,您对context.Database.ExecuteSqlCommand
的调用将返回0而不是1
如果限制为1000,则更新SQL为:
count = context.Database.ExecuteSqlCommand(
"UPDATE dbo.Articles SET Revisions = Revisions + 1 WHERE Id=@p0 AND Revisions < 1000;", articleId);
count=context.Database.ExecuteSqlCommand(
“更新dbo.Articles SET Revisions=Revisions+1,其中Id=@p0,Revisions<1000;”,articleId);
然后,您将测试
count==0
,如果是,则会发出错误消息。您可以在UPDATE
语句中使用WHERE
子句来执行此操作,该子句将执行测试。如果测试失败,更新将不会发生,您对context.Database.ExecuteSqlCommand
的调用将返回0而不是1
如果限制为1000,则更新SQL为:
count = context.Database.ExecuteSqlCommand(
"UPDATE dbo.Articles SET Revisions = Revisions + 1 WHERE Id=@p0 AND Revisions < 1000;", articleId);
count=context.Database.ExecuteSqlCommand(
“更新dbo.Articles SET Revisions=Revisions+1,其中Id=@p0,Revisions<1000;”,articleId);
然后,您将测试count==0,如果是,则会发出错误消息。有点重,但是
UPDATE dbo.Articles
SET Revisions = Revisions + 1
WHERE Id=@p0
AND sqrt(Revisions - @MaxRevisions - 2) >= 0;
如果修订-@Revisions-2为负数,则将抛出
发生无效的浮点操作
错误有点重,但是
UPDATE dbo.Articles
SET Revisions = Revisions + 1
WHERE Id=@p0
AND sqrt(Revisions - @MaxRevisions - 2) >= 0;
如果修订-@Revisions-2为负数,则将抛出
发生无效的浮点操作
错误我在想什么样的错误?数据库引擎出现异常?或者您是否有一个连接到数据库引擎的编程环境来触发错误?@trincot,请查看更新的“上下文”部分您认为是哪种错误?数据库引擎出现异常?或者您是否有一个连接到数据库引擎的编程环境来触发错误?@trincot,请参阅更新的“上下文”部分如果修订版+1 isg大于100,这会引发某种错误吗?不,不会。很抱歉,我错过了这个要求。如果修订版+1 isg大于100,这会抛出某种错误吗?不会。抱歉,我错过了这个要求。我认为在这种情况下,检查约束将强制属性修订中的所有值满足此条件。有没有办法只对一行执行此操作?您可以向表中添加一列
revision\u limit
,并将约束更改为revisions介于0和revision\u limit之间。这使您能够为每行指定单独的修订限制。您还可以向表中添加一个布尔列unlimited\u revisions
,并使约束unlimited\u revisions或(0和revision\u limit之间的修订)
@Artem:您真的希望只有一行对修订数量有约束吗,或者,是否希望每一行对修订数量具有不同的约束?在任何一种情况下,请考虑编辑您的问题,并澄清您所说的开发人员提供的常量是什么意思。@Mike Sherrill“Cat Recall”,是的,我使用了修订id作为更大问题的简化示例。无论如何,谢谢你的回答!:)如果有人想在所有属性上强制执行此规则,那么它将在解决方案中起作用。我认为在这种情况下,检查约束将强制属性修订中的所有值满足此条件。有没有办法只对一行执行此操作?您可以向表中添加一列revision\u limit
,并将约束更改为revisions介于0和revision\u limit之间。这使您能够为每行指定单独的修订限制。您还可以向表中添加一个布尔列unlimited\u revisions
,并使约束unlimited\u revisions或(0和revision\u limit之间的修订)
@Artem:您真的希望只有一行对修订数量有约束吗,或者,是否希望每一行对修订数量具有不同的约束?在任何一种情况下,请考虑编辑您的问题,并澄清您所说的开发人员提供的常量是什么意思。@Mike Sherrill“Cat Recall”,是的,我使用了修订id作为更大问题的简化示例。无论如何,谢谢你的回答!:)如果有人想在所有属性上强制执行此规则,那么它将在解决方案中起作用。谢谢您的回答!这个解决方案非常适合我!也许一个小缺点是,当对象不存在时,count=0将为零。然而,这在我的问题上并不重要。再次感谢!:)A.