追溯到关系数据库理论的创始人E F Codd就出现了这样一个通用原则永远不存储可被计算的数据这个原则回避了这样一个问题我们应该在什么地方计算这个计算结果?默认的答案是在前台应用程序 假设一个表包含SubTotal 和TaxRate 两个列根据这一原则列TaxAmount 和Total 应该是虚的因此将它们创建为视图或存储过程的一部分或者采用另外一种方法将它们留给前台应用程序来计算并将结果呈现给用户 该原则的一个替代方案叫做计算列(computed column)使用这个表达式你就可以将一个计算列声明为 CREATE TABLE 语句的一部分然而它还可以下达给数据库(要么是通过图形用户界面 GUI 要么直接通过数据定义语言 DDL 指令) 假设一个数据库包含有房子粉刷估计忽略一些细节比如房子的窗户和门的数目(并假设所有的墙都粉刷成同样的颜色)还有两个问题需要解决我们要将天花板粉刷成一样的颜色吗(一般答案都是不要)我们要粉刷几层(一般答案都是两层)? 如果不使用计算列我们就要把这些问题推迟到以后解决并把结果计算任务交给前台应用程序来完成有了计算列我们就可以在数据库中嵌入公式创建一个虚列提供给任何前台使用 可以使用下面这样的语句来创建表 CREATE TABLE [TestComputedColumns] ( [PK] [int] IDENTITY ( ) NOT NULL [Length] [int] NOT NULL [Width] [int] NOT NULL [Height] [int] NOT NULL [Coats] [int] NOT NULL CONSTRAINT [DF_TestComputedColumns_Coats] DEFAULT () [IncludeCeiling] [bit] NOT NULL CONSTRAINT [DF_TestComputedColumns_IncludeCeiling] DEFAULT () [Area] AS (( * ([Height] * [Length] + [Height] * [Width]) + [Length] * [Width] * [IncludeCeiling]) * [Coats]) CONSTRAINT [PK_TestComputedColumns] PRIMARY KEYCLUSTERED ( [PK] )ON [PRIMARY] ) ON [PRIMARY] GO 你不妨使用自己的前台程序插入几行数据看其运行效果例如使用Access 及更高版本 Access创建一个 Access 数据项目(ADPAccess Data Project)指向你的数据库选择表然后创建一个 AutoFrom(自动窗体)输入一两行数据然后翻回到你所输入的条目你将看到计算列已经有了正确的值 |