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

我是 stackoverflow 的新手,最糟糕的是我是 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% 的学生问题都在同一条船上 - 讲师或教科书根本不正确或具有误导性。

标签: sql ms-access


【解决方案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 是一个奇迹。这实际上是在浪费时间,尤其是考虑到没有公司使用它
    猜你喜欢
    • 2011-05-17
    • 1970-01-01
    • 1970-01-01
    • 2013-01-08
    • 2014-12-11
    • 2012-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多