1

我的问题很简单,但我不确定是否可能。

假设我有一个表,它包含下面的列

PokemonHappiness    smallint

是否可以为该列设置最大值?

例如,如果我将最大值设置为 10000 并发送这样的查询

--Assume that PokemonHappiness is equal to 9990
update mytable set PokemonHappiness = PokemonHappiness+50   

它应该变成 10000 而不是 10040

这可能吗?

4

4 回答 4

5

如果要在 SQL 表的列上设置最大值,您可以做的一件事是CHECK为该列添加具有特定条件的约束:

ALTER TABLE dbo.mytable ADD CONSTRAINT CK_HAPPINESS_MAX CHECK (PokemonHappiness <= 10000)

但是,这不会以优雅的方式处理越界输入;如果您的输入违反了CHECK约束,SQL 将简单地抛出一个错误。

要正确处理此类输入,您可能应该使用CASE其他人建议的表达式,并且可能使用CHECK约束作为可以插入的内容的硬绑定(以防输入值未经审核)。

于 2012-10-12T23:18:09.637 回答
2

当您想将其设置为 10000 时,请不要将其设置为 10040。您的“自动更新”会产生副作用并且非常容易出错(考虑到您会忘记它或有人不知道它)。但你可以使用CASE

UPDATE dbo.MyTable 
SET PokemonHappiness = 
       ( CASE 
           WHEN (PokemonHappiness + 50) > 10000 THEN 10000
           ELSE (PokemonHappiness + 50) 
         END
       )
于 2012-10-12T23:12:32.523 回答
1

一个触发器。我对此进行了测试。

CREATE TRIGGER dbo.Table_2update
ON dbo.Table_2
FOR INSERT, UPDATE 
AS BEGIN
  UPDATE dbo.Table_2 SET dbo.Table_2.memberID = 10000
  FROM INSERTED
  WHERE inserted.id = Table_2.id 
    AND dbo.Table_2.memberID > 10000
END
于 2012-10-12T23:56:45.280 回答
0

你可以用这个来实现

update mytable set PokemonHappiness=(CASE WHEN (PokemonHappiness+50) > 10000 
                                      THEN 10000 ELSE PokemonHappiness+50 END)

或有两个查询

update mytable set PokemonHappiness=PokemonHappiness+50 

update mytable set PokemonHappiness=10000 where PokemonHappiness > 10000
于 2012-10-12T23:12:22.437 回答