通过DDL创建具有CHECK约束的Access表时出错


CREATE TABLE Food_Supply_Disp
(
Supply_Disp text,
SD_2008 DOUBLE,
SD_2009 DOUBLE,
SD_2010 DOUBLE,
CHECK (SD_2008 > 0.0 )
);

可以向Access表添加CHECK约束,但我的理解是适用以下限制:

  1. CHECK约束必须在创建表后添加,并且
  2. 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数据类型。

相关内容

最新更新