CREATE TABLE,检查可能的文本值

时间:2013-03-17 23:58:21

标签: sql ms-access

我正在使用MS Access 2010,我正在尝试使用SQL创建表。我想提出一些检查限制,但我遇到了一些麻烦:

CREATE TABLE Test (
tester Text CHECK (tester IN ('ABC', 'BCD', 'CDE'))
);

我收到语法错误,

有什么建议吗?

谢谢!

编辑:对不起,如果我不清楚。我真正想要的是检查测试仪是“ABC”,“BCD”还是“CDE”,这是他唯一可以拥有的值。

EDIT2:我尝试了别的东西:

CREATE TABLE Test (
tester Text NOT NULL,
CONSTRAINT m_pk PRIMARY KEY(tester),
CONSTRAINT check_tester CHECK (DATALENGTH(tester) > 2)
);

我也遇到语法错误。是否有一些我真的不理解检查文本值?我不可能看到其中任何一个是错误的。

3 个答案:

答案 0 :(得分:3)

从Jet 4开始,从ADO执行的Access DDL支持CHECK约束,但不支持来自DAO。

您可以执行单个DDL语句,该语句使用您的约束创建表Test。您不需要执行一个语句来创建表,然后再执行另一个语句来添加约束。

CREATE TABLE Test
    (
        tester TEXT(255),
        CONSTRAINT ABC_or_BCD_or_CDE CHECK
            (
                tester IN ('ABC', 'BCD', 'CDE')
            )
    );

我将其格式化,以便更容易检查碎片。您可以使用此VBA来执行语句:

strSql = "CREATE TABLE Test ( tester Text(255)," & vbCrLf & _
    "CONSTRAINT ABC_or_BCD_or_CDE" & vbCrLf & _
    "CHECK ( tester IN ('ABC', 'BCD', 'CDE')));"
Debug.Print strSql
CurrentProject.Connection.Execute strSql

注意:

  • CurrentProject.Connection是一个ADO对象,因此其.Execute方法成功。使用CurrentDb.Execute(DAO方法)的相同语句将失败。
  • 使用ADO,将字段声明为TEXT而不包括长度(tester TEXT而不是tester TEXT(255))将为您提供备注字段。

答案 1 :(得分:2)

您需要针对连接运行:

ssql = "CREATE TABLE Test (tester Text)"
CurrentProject.Connection.Execute ssql

ssql = "ALTER TABLE test ADD CONSTRAINT " _
     & "myrule CHECK (tester IN ('ABC', 'BCD', 'CDE'))"
CurrentProject.Connection.Execute ssql

或者

sSQL = "CREATE TABLE Test (tester Text, " _
     & "CONSTRAINT myrule CHECK (tester IN ('ABC', 'BCD', 'CDE')))"

请注意,在这种情况下,名称myrule必须不存在,即使对于其他表也是如此。

一些说明:Is it possible to create a check constraint in access and/or DAO?

答案 2 :(得分:-1)

我的坏, 看起来MS Access不允许除主键和外键之外的CHECK约束。直到去年,我的老师一直在用Oracle教授课程,显然没有看到在MS Access中无法做到这一点。