我的问题很简单,但我不确定这是否可能。
假设我有一个表格,它包含以下列
PokemonHappiness smallint
是否可以为该列设置最大值?
例如,如果我将最大值设置为 10000 并发送这样的查询
--Assume that PokemonHappiness is equal to 9990
update mytable set PokemonHappiness = PokemonHappiness+50
它应该变成 10000 而不是 10040
这可能吗?
如果要在 SQL 表的列上设置最大值,可以做的一件事是添加一个具有该列特定条件的CHECK
约束:
ALTER TABLE dbo.mytable ADD CONSTRAINT CK_HAPPINESS_MAX CHECK (PokemonHappiness <= 10000)
但是,这不会以优雅的方式处理越界输入;如果您的输入违反了CHECK
约束,SQL 将简单地抛出错误。
要正确处理此类输入,您可能应该按照其他人的建议使用 CASE
表达式,并且可能使用 CHECK
约束作为可以插入的内容的硬绑定(以防输入值未经审核)。
如果要将其设置为 10000,请不要将其设置为 10040。您的"自动更新"会产生副作用,并且非常容易出错(考虑到您会忘记它或有人不知道它)。但是您可以使用CASE
:
UPDATE dbo.MyTable
SET PokemonHappiness =
( CASE
WHEN (PokemonHappiness + 50) > 10000 THEN 10000
ELSE (PokemonHappiness + 50)
END
)
触发器。 我测试了这个。
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
你可以用这个来实现这一点
update mytable set PokemonHappiness=(CASE WHEN (PokemonHappiness+50) > 10000
THEN 10000 ELSE PokemonHappiness+50 END)
OR与两个查询
update mytable set PokemonHappiness=PokemonHappiness+50
update mytable set PokemonHappiness=10000 where PokemonHappiness > 10000