CREATE TABLE Food_Supply_Disp
(
Supply_Disp text,
SD_2008 DOUBLE,
SD_2009 DOUBLE,
SD_2010 DOUBLE,
CHECK (SD_2008 > 0.0 )
);
可以向Access表添加CHECK约束,但我的理解是适用以下限制:
- CHECK约束必须在创建表后添加,并且
- DDL语句必须通过ADO连接执行
在Access VBA中,它可能是这样的:
Dim con As ADODB.Connection
Set con = CurrentProject.Connection
con.Execute _
"CREATE TABLE Food_Supply_Disp ( " & _
"Supply_Disp TEXT(100), " & _
"SD_2008 DOUBLE, " & _
"SD_2009 DOUBLE, " & _
"SD_2010 DOUBLE " & _
")"
con.Execute _
"ALTER TABLE Food_Supply_Disp " & _
"ADD CONSTRAINT CHECK_SD_2008 " & _
"CHECK (SD_2008 > 0.0)"
Set con = Nothing
您的语句是有效的Access DDL,但正如Gord所提到的,它必须从ADO执行。如果您尝试从查询设计器或使用CurrentDb.Execute
执行该语句,它将触发错误#3289,"CONSTRAINT子句中的语法错误。">
但是,我建议您考虑为约束包含一个名称。原因是当用户试图输入违反约束的值时,约束名称会包含在错误消息中。而且,如果您不提供约束的名称,Access将为您提供一个名称。。。并且在错误消息中它将没有帮助。例如,以下是我在执行CREATE TABLE
,然后尝试将INSERT
-1转换为SD_2008
之后得到的错误消息。
"为'Food_Supply_Disp'设置的验证规则'Check_7411684B_BA50_4EEF'禁止一个或多个值。输入此字段的表达式可以接受的值。">
但是添加一个有意义的约束名称。。。
CREATE TABLE Food_Supply_Disp
(
Supply_Disp text,
SD_2008 DOUBLE,
SD_2009 DOUBLE,
SD_2010 DOUBLE,
CONSTRAINT [SD_2008 must be > 0] CHECK (SD_2008 > 0.0 )
);
给我一个更有用的错误消息。。。
"验证禁止一个或多个值必须为"Food_Supply_Disp"设置规则"SD_2008">0。输入此字段的表达式可以接受的值。">
这仍然不是一个很好的错误消息,但比第一个要好。
第二个问题是,使用ADO中的Supply_Disp text
执行CREATE TABLE
会使Supply_Disp
成为一个备忘录字段。如果您想要一个常规文本字段,请限定字段长度。。。Supply_Disp text(255)
最后,您可以使用ADO下的Access DDL执行您想要的操作。但是,对于本例,我更愿意在表设计中设置字段的验证规则和有效文本属性,而不是使用CHECK
约束。可以从用户界面执行此操作,也可以使用VBA修改表的DAO.TableDef
。
您需要使用float而不是double,因为double不是有效的sql数据类型。