将现有列作为自己的值处理(在未来的行中将为0),添加两个新列,然后创建一个与旧的Total相同名称的计算列?像这样的东西(我假设的decimal(7, 2)
数据类型,但是当然可以用你所拥有的,但我希望这不是float
):
EXEC sp_rename 'dbo.Miles.TotalDailyMiles', 'DailyMiles';
ALTER TABLE dbo.Miles ADD COLUMN AMMiles decimal(7, 2) NOT NULL
CONSTRAINT DF_Miles_AMMiles DEFAULT (0);
ALTER TABLE dbo.Miles ADD COLUMN PMMiles decimal(7, 2) NOT NULL
CONSTRAINT DF_Miles_PMMiles DEFAULT (0);
ALTER TABLE dbo.Miles ADD COLUMN TotalDailyMiles
AS (DailyMiles + AMMiles + PMMiles) PERSISTED;
一些可能的管家,可能需要在DailyMiles柱,太:
-- if not already NOT NULL
ALTER TABLE dbo.Miles ALTER COLUMN AMMiles decimal(7, 2) NOT NULL;
-- if not already defaulting to 0
ALTER TABLE dbo.Miles ADD
CONSTRAINT DF_Miles_DailyMiles DEFAULT (0) FOR DailyMiles;
你可以另加要么DailyMiles
必须为0,或AMMiles
和PMMiles
约束都必须是0:
ALTER TABLE dbo.Miles ADD CONSTRAINT CK_Miles_DailyOrAMPM
CHECK (DailyMiles = 0 OR (AMMiles = 0 AND PMMiles = 0));
只要数据的使用者不尝试更新TotalDailyMiles
列,您已经方便地解决了您的问题。
触发器绝对是这里走的路。我会害怕分裂列中的两个零和总数不匹配。也许至少用一个值填充一个,另一个用0填充,所以任何新的代码也可以工作。 – Randy
@Randy imho,触发器不是要走的路。看到我的答案。 – ErikE