【问题标题】:Jet/Access DDL: How to create FOREIGN KEY constraints without data integrity check?Jet/Access DDL:如何在没有数据完整性检查的情况下创建 FOREIGN KEY 约束?
【发布时间】:2011-05-07 05:43:17
【问题描述】:

当您使用 Access 创建外键约束(通过数据库架构编辑器)时,您可以选择启用或禁用以下选项(实际标题可能不同,我只有 Access 的本地化版本):

x Enforce data integrity
  x Cascade updates
  x Cascade deletions

在 DDL 中,后两者可以表示为:

ADD CONSTRAINT Constraint1
  FOREIGN KEY (Field1)
  REFERENCES Table2 (Table2Field1)
  ON UPDATE CASCADE
  ON DELETE CASCADE

但是你如何模拟没有一个复选框被打开的情况,甚至没有“强制完整性”?

仅删除“ON UPDATE/ON DELETE”子句仍会产生等效于“强制完整性”约束(因此要求 Field1 和 Table2Field1 具有索引)。

【问题讨论】:

  • 这里有一个可能感兴趣的讨论:dbforums.com/microsoft-access/…
  • 您认为在没有参照完整性的情况下创建关系有什么价值?
  • @HansUp:我正在编写一个工具来导出 Access 数据库架构,然后解析 SQL 并重新创建数据库。如果有人在他们的数据库中有这种关系,我不能忽略它。
  • @himself:为什么不按正确的顺序重新创建表以使约束有效?您只会遇到麻烦,然后对于具有相互引用的表,在这种情况下,您需要在创建表之一后添加约束
  • @himself :我认为您将不得不使用 DAO 和 ADO 来复制数据库。这不是您在 ADO 中重新创建时遇到的唯一问题。

标签: sql ms-access ddl jet


【解决方案1】:

我认为您将访问“关系”与 ACE/Jet FOREIGN KEY 混淆了。

一般来说,您不能使用 SQL DDL 创建 Access 对象(即使这些对象被持久化在 ACE/Jet 表中)。另一个例子是验证规则,但是您可以使用 SQL DDL 创建CHECK 约束(实际上不能以任何其他方式创建),这些约束更强大(例如,每个表可以有多个,可以引用同一个表中的其他行或其他表等),但验证规则显示在 adSchemaTableConstraints 架构 VIEW 中,CONSTRAINT_TYPE = 'CHECK'。

【讨论】:

  • 嗯,是的。但是关系/外键大多在一起,如果您检查模式(使用 OpenSchema 获得的模式),即使是非完整性检查的关系也表示为“外键”。此外,当您创建外键时,Access 会自动将其视为关系。
  • @himself:他们出现在信息架构中?这听起来不对。如果他们这样做了,那么我怀疑是一个错误,我看不出向他们展示的意义。毕竟,您可以在不同数据类型的列上创建访问关系!
  • 是的,正是在 adSchemaReferentialConstraints、adSchemaTableConstraints 和 adSchemaForeignKeys 中。我想我也得想办法把它们和普通的外键区分开来。
  • @himself:你能检测到使用NO INDEX IN SQL DDL 创建的 FK 吗?
  • 我刚刚测试了创建访问关系(我花了一段时间才找到一台安装了它的机器!)您确实是正确的:它显示在 FK 视图中。我的工具有一个代码注释:“Jet 似乎允许基于无名 PK 的 FK!”我认为您应该能够通过在 FK 记录集中测试 !PK_NAMENull 来检测与 FK 不同的关系。
【解决方案2】:

在添加外键约束时使用 NOCHECK 选项。欲了解更多信息,请参阅此页面:

http://msdn.microsoft.com/en-us/library/ms177463.aspx

【讨论】:

  • NOCHECK 确实适用于 SQL Server。
【解决方案3】:

如果您不希望强制执行完整性,那么您确实不希望约束,因为外键约束的目的是通过公共字段强制两个表之间的关系。据我所知,如果您不希望强制执行完整性、级联更新或级联删除,那么您根本不需要约束。把它关掉吧。

我想在某些数据库(例如 Oracle)中,您可以创建约束但将其禁用 - 但这似乎毫无意义,除了文档的好处。无法在 Access 中禁用 AFAIK 约束,但我可能是错的。

分享和享受。

【讨论】:

  • 查看我对该问题的评论。这可能是真的,但我无法控制 DB 中的内容。
猜你喜欢
  • 2021-01-26
  • 2014-11-27
  • 1970-01-01
  • 1970-01-01
  • 2014-03-20
  • 2023-03-22
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多