使用ON DELETE CASCADE定义表时出现语法错误

nei*_*zan 3 ms-access constraints ms-access-2007

我试图ON DELETE CASCADE在MS Access 2007中使用FK约束,但我在表定义上遇到错误:

SQL错误:CONSTRAINT子句中的语法错误.

这是创建表的代码:

CREATE TABLE Area (
    Id AUTOINCREMENT PRIMARY KEY, 
    AreaType__Id int NOT NULL, 
    Tbl1 text(31) NOT NULL, 
    Tbl2__Id int NOT NULL, 
    CONSTRAINT UK_Area_1 UNIQUE (Tbl1, Container__Id), 
    CONSTRAINT FK_Area_1 FOREIGN KEY (AreaType__Id) REFERENCES AreaType (Id), 
    CONSTRAINT FK_Area_2 FOREIGN KEY (Tbl2__Id) REFERENCES Tbl2 (Id) ON UPDATE CASCADE ON DELETE CASCADE
);
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?我查看了Access帮助,我的语法似乎正确.我已经尝试删除该ON UPDATE CASCADE部分,但得到了同样的错误.我也尝试使用默认的PK字段作为引用的表(REFERENCES Container而不是REFERENCES Container (Id)),但同样出现了相同的错误.我也搜索了SO,但没有找到有用的信息我的情况.它必须是简单的东西,但我现在还没有看到它.

编辑

值得一提的是,表定义完全正常,除非没有该ON UPDATE CASCADE ON DELETE CASCADE部分.只有在添加CASCADE部件后才会出现错误.

编辑2

为了查明问题,这里有一个新的测试代码,用于演示错误:

这个工作:

CREATE TABLE T1 (Id AUTOINCREMENT PRIMARY KEY);

CREATE TABLE T2 (
    Id AUTOINCREMENT PRIMARY KEY, 
    T1__Id int NOT NULL, 
    CONSTRAINT FK_T2_1 FOREIGN KEY (T1__Id) REFERENCES T1 (Id)
);
Run Code Online (Sandbox Code Playgroud)

这给了错误:

CREATE TABLE T1 (Id AUTOINCREMENT PRIMARY KEY);

CREATE TABLE T2 (
    Id AUTOINCREMENT PRIMARY KEY, 
    T1__Id int NOT NULL, 
    CONSTRAINT FK_T2_1 FOREIGN KEY (T1__Id) REFERENCES T1 (Id) ON DELETE CASCADE
);
Run Code Online (Sandbox Code Playgroud)

任何人都可以复制错误吗?

Han*_*sUp 5

您的CREATE语句是有效的Access DDL,但必须使用ADO执行.

这是一个立即窗口会话,演示了这个问题......

strSql = "CREATE TABLE T2 (" & vbCrLf & _
"    Id AUTOINCREMENT PRIMARY KEY, " & vbCrLf & _
"    T1__Id int NOT NULL, " & vbCrLf & _
"    CONSTRAINT FK_T2_1 FOREIGN KEY (T1__Id) REFERENCES T1 (Id) ON DELETE CASCADE" & vbCrLf & _
");"

' executing that statement with DAO triggers error 3289,
' "Syntax error in CONSTRAINT clause."
' (CurrentDb.Execute is a DAO Method)
CurrentDb.Execute strSql ' DAO -> fail

' CurrentProject.Connection.Execute is an ADO method,
' so this attempt executes without error
CurrentProject.Connection.Execute strSql ' ADO -> OK
Run Code Online (Sandbox Code Playgroud)

请注意,如果您尝试从Access查询设计器执​​行该语句,该语句也使用DAO,那么也会触发错误3289.