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

时间:2014-02-08 20:18:22

标签: sql ms-access

CREATE TABLE Food_Supply_Disp
(
Supply_Disp text,
SD_2008 DOUBLE,
SD_2009 DOUBLE,
SD_2010 DOUBLE,

CHECK (SD_2008 > 0.0 )

);

3 个答案:

答案 0 :(得分:1)

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

  1. 必须在创建表后
  2. 添加CHECK约束
  3. 必须通过ADO连接执行DDL语句。
  4. 在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数据类型。