CREATE TABLE Food_Supply_Disp
(
Supply_Disp text,
SD_2008 DOUBLE,
SD_2009 DOUBLE,
SD_2010 DOUBLE,
CHECK (SD_2008 > 0.0 )
);
答案 0 :(得分:1)
可以向Access表添加CHECK约束,但我的理解是以下限制适用:
在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
答案 1 :(得分:1)
您的声明是有效的Access DDL,但正如Gord所说,它必须从ADO执行。如果您尝试从查询设计器或CurrentDb.Execute
执行该语句,它将触发错误#3289," CONSTRAINT子句中的语法错误。"
但是我建议您考虑包含约束的名称。原因是当用户尝试输入违反约束的值时,约束名称包含在错误消息中。并且,如果您没有为约束提供名称,Access将为您提供一个...并且在错误消息中没有帮助。例如,以下是我执行CREATE TABLE
后尝试INSERT
-1进入SD_2008
后收到的错误消息。
"验证规则禁止一个或多个值' Check_7411684B_BA50_4EEF'设置为' Food_Supply_Disp'。 输入此字段的表达式可以接受的值。"
但是添加了一个有意义的约束名......
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 )
);
...给了我一个更有用的错误信息......
"验证禁止一个或多个值 规则' SD_2008必须> 0'设置为' Food_Supply_Disp'。 输入此字段的表达式可以接受的值。"
它仍然不是一个很好的错误信息,但比第一个更好。
第二个问题是,从ADO执行CREATE TABLE
Supply_Disp text
会使Supply_Disp
成为备忘录字段。如果您希望常规文本字段限定字段长度... Supply_Disp text(255)
最后,您可以使用ADO下的Access DDL执行所需操作。但是,对于这个,我宁愿在表设计中设置字段的验证规则和验证文本属性,而不是使用CHECK
约束。您可以通过用户界面或使用VBA修改表格DAO.TableDef
来执行此操作。
答案 2 :(得分:0)
你需要使用float而不是double,因为double不是有效的sql数据类型。