Microsoft Access - SQL 命令添加约束

Posted

技术标签:

【中文标题】Microsoft Access - SQL 命令添加约束【英文标题】:Microsoft Access - SQL command to add a constraint 【发布时间】:2014-07-28 00:49:47 【问题描述】:

我是 *** 的新手,最糟糕的是我是 Microsoft Access 的新手。我的作业

假设 Part 表已创建,但没有完整性约束。创建必要的完整性约束以确保 Class 字段的唯一允许值是 AP、HW 和 SG。确保 PartNum 字段为主键,OrderLine 表中 PartNum 字段为外键,必须与 Part 表主键匹配。

所以我知道如何使用 Microsoft Access 通过转到验证规则并添加对 AP、HW 和 SG 的验证来创建它。但是,我还需要创建查询以显示这是如何完成的。

我的代码:

ALTER TABLE Parts
ADD CONSTRAINT classRule
CHECK IN Class(AP, HW, SG)
;

我的教科书有一个例子,和我上面写的很相似。当我运行它时,我得到一个约束错误。我究竟做错了什么?此外,外键和主键已经生成,所以我只需要编写 sql 查询来显示我的结果。任何帮助表示赞赏!

【问题讨论】:

您的教科书或讲师完全错误。我估计这里 50% 的学生问题都在同一条船上 - 讲师或教科书根本不正确或具有误导性。 【参考方案1】:

CHECK 子句存在,但使用它并不是一个特别好的主意,因为它可以创建 issues in you application。

话虽如此,您的约束应该有效,但有几件事:

您应该避免使用单词Class 作为字段名称。它本身不是保留字,但它是 VBA 保留字,虽然 Access 允许您创建该字段,但您以后可能会在其他地方遇到奇怪的问题。

正如 Brian 所说,您需要在 CHECK 中为字符串文字使用单引号

您不能在 Access 的 SQL 查询编辑器中使用 CHECK 创建 CONTRAINT,每次尝试时都会在 CHECK 部分出现错误。 相反,您需要从 VBA 执行 DDL SQL:只需打开 VBA (Alt+F11),然后在即时窗口中键入以下内容(如果没有看到,请按 Ctrl-G),然后按 ENTER:

CurrentProject.Connection.Execute "ALTER TABLE Parts ADD CONSTRAINT ClassRule CHECK (Class IN ('AP', 'HW', 'SG'));"

如果您没有收到错误,则说明约束已正确执行,否则,请仔细检查语法是否正确、字段名称、括号是否正确平衡,以及 Part 表是否未打开。

【讨论】:

【参考方案2】:

你可能想要:

ALTER TABLE Parts
ADD CONSTRAINT classRule
CHECK (class in ('AP', 'HW', 'SG'));

CONSTRAINT 和名称之间有一个空格

将条件放在 CHECK 关键字后面的 () 内

将文字放在单引号内,因为这是区分字段名称和值的原因

编辑

虽然以上是有效的语法,但从我读到的内容来看,您可能无法通过写出 SQL 在 Access 中添加检查约束,至少不能在查询设计器的 SQL 视图中。

您可以通过转到感兴趣表的设计视图来添加检查约束,然后在表示感兴趣列的行上,在“验证规则”行中键入以下内容:

in ('AP', 'HW', 'SG')

http://www.databaseskill.com/1942875/

"注意检查约束语句只能通过 Jet OLE DB 提供程序和 ADO 执行;如果通过 Access SQL View 用户界面使用,它将返回错误消息。"

以上引用来自我刚刚提供的网址。

【讨论】:

我试过你的代码,还是不行!我正在使用 MSAccess 2013,我不知道这是否有帮助。 这是大多数数据库的正确语法,即。 sqlfiddle.com/#!4/ba55e/1/0 但是我也刚刚在 access 2013 中尝试过,但无法让它工作。这很奇怪,因为我在网上找不到任何表明访问语法不同的东西。虽然 Access 是一个奇怪的数据库......如果我有任何运气,我会告诉你的 @user3882733 刚刚确认,在 Access 中,您无法在 sql 视图 databaseskill.com/1942875 中写出用于检查约束的 sql,但是如果您能够,我的答案中的 sql 就是您要写的。 @BrianDeMilia Access 实现了相当小的 SQL 子集,并为其添加了许多怪癖(我喜欢称它为“Bill 的 QL”)。实际上,必须在表设计视图中定义字段约束(验证规则)。行约束也可以在表设计视图中定义,打开表属性窗口。至于参照完整性约束,它们可以在“关系”窗口中定义(在功能区的某处寻找“关系”按钮......我已经有一段时间没有使用访问权限了) @Barranka 是的......考虑到它与任何其他广泛使用的数据库几乎没有相似之处,而所有其他广泛使用的数据库在很多方面都相似,为什么学校甚至使用它来教授 sql 是一个奇迹。这实际上是在浪费时间,尤其是考虑到没有公司使用它

以上是关于Microsoft Access - SQL 命令添加约束的主要内容,如果未能解决你的问题,请参考以下文章

Microsoft Access 使用 Access 中的 SQL 查询合并两个 Excel 文件

将 Microsoft SQL Server 中的文件表链接到 Microsoft Access 2016 中的表

使用 Access SQL 函数时,Microsoft Access ODBC 驱动程序导致访问冲突

SQL 服务器上的 Microsoft Access 死锁

odbc_exec():SQL 错误:[Microsoft][ODBC Microsoft Access Driver] 参数太少。预期 1.,SQLExecDirect 中的 SQL 状态 0700

在 Microsoft Access 中使用 SQL 语句忽略周末