SQL 学习者 -- MS Access 2013 关于更新级联和删除级联

问题描述 投票:0回答:2

我是 SQL 新手,尝试从 2008 年出版的《SQL for Microsoft Access 第 2 版》一书中获取一些方便的知识。

第3章介绍了关键字ON UPDATE CASCADE ON DELETE CASCADE。我尝试在 MS Access 2013 的 SQL 视图中运行带有关键字的语句。有一条错误消息说

“CONSTRAINT 子句中存在语法错误。”

这些语句在没有

ON UPDATE CASCADE ON DELETE CASCADE
的情况下也能完美运行。

书中的注释解释了这些关键字在 SQL-92 之前的版本上不起作用。我猜 Access 2013 远远晚于 SQL-92。

谁能向我解释为什么关键字不起作用?

以下是语句(ON UPDATE CASCADE ON DELETE CASCADE 在最后):

CREATE TABLE tblManufacturers
(
ManufacturerID INTEGER CONSTRAINT ManfID PRIMARY KEY,
ToyID INTEGER NOT NULL,
CompanyName CHAR (50) NOT NULL,
Address CHAR (50) NOT NULL,
City CHAR (20) NOT NULL,
State CHAR (2) NOT NULL,
PostalCode CHAR (5) NOT NULL,
AreaCode CHAR (3) NOT NULL,
PhoneNumber CHAR (8) NOT NULL UNIQUE,
CONSTRAINT ToyFk FOREIGN KEY (ToyID) REFERENCES tblToys (ToyID) 
ON UPDATE CASCADE
ON DELETE CASCADE
);
sql ms-access
2个回答
1
投票

Access 不支持

ON UPDATE CASCADE
ON DELETE CASCADE
语句(请参阅 https://msdn.microsoft.com/en-us/library/office/ff836971.aspx)。

关于功能,您应该不需要使用

ON UPDATE CASCADE
。此约束意味着,如果您确实更改了主表中的主键,则更改会传播到引用主表的每个子表。在 SQL 世界中,更改主键被认为是不行的。如果您确实必须更改主键(由于发生某种灾难),这将通过脚本、大量备份和极其小心来完成。主键是这样的:表中行的唯一(理想情况是全局)、不可变的标识符。

ON DELETE CASCADE
表示如果删除主表中的一行,子表中引用此键的任何行也将被删除。虽然这听起来像是一个懒惰的捷径,但我建议不要这样做,并在应用程序逻辑中执行此操作(可能有一个用例,您希望保留记录或记录它们或对它们执行某些操作,而不是盲目地从数据库中删除它们。


1
投票

这些关键字不起作用,因为 DAO 不支持它们。内置查询生成器也使用 DAO。如果您想使用

CASCADE
关键字创建表,可以仅使用 ADO 在 VBA 中完成:

CurrentProject.Connection.Execute strSQL

strSQL这里包含

CREATE TABLE
语句

© www.soinside.com 2019 - 2024. All rights reserved.