我正在使用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)
);
我也遇到语法错误。是否有一些我真的不理解检查文本值?我不可能看到其中任何一个是错误的。
答案 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方法)的相同语句将失败。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中无法做到这一点。