访问 SQL 以在不强制参照完整性的情况下创建一对多关系
Access SQL to create one-to-many relation without Enforce Referential Integrity
我有这个关系。我必须暂时销毁它只是为了使用 SQL 命令更改 "salID" 字段的大小:
ALTER TABLE Adressen DROP CONSTRAINT [ChildTableMainTable]
如何使用 SQL 命令重新创建相同的关系类型?
如果我使用下一个 SQL 我得到一个一对多的关系。这不是我需要的:
ALTER TABLE MainTable ADD CONSTRAINT [ChildTableMainTable] FOREIGN KEY (salID) REFERENCES [ChildTable] (ChildPK);
据我所知,Access DDL 根本不支持在没有 "Enforce Referential Integrity" 的情况下创建 Access "Relationship"。 CREATE CONSTRAINT
将创建 with "Enforce Referential Integrity" 关系,因为这正是这种关系的本质:参照完整性 constraint。
(CREATE CONSTRAINT
的 ON UPDATE
和 ON DELETE
子句控制“编辑关系”对话框中 "Cascade Update Related Fields" 和 "Cascade Delete Related Records" 复选框的值,但它们不要控制 "Enforce Referential Integrity" 复选框本身的值。)
换句话说,没有 "Enforce Referential Integrity" 的关系根本不是约束。这只是一个 "hint" 表通过指定的字段相关联,例如,如果将表添加到查询设计中,查询构建器可以自动连接这些表。
要在没有 "Enforce Referential Integrity" 的情况下创建关系,您需要使用 Access DAO。对于这样的关系
VBA 中所需的代码为
Option Compare Database
Option Explicit
Public Sub CreateRelationship(relationshipName As String, _
parentTableName As String, childTableName As String, _
parentTablePkName As String, childTableFkName As String)
Dim cdb As DAO.Database
Set cdb = CurrentDb
Dim rel As DAO.Relation
Set rel = cdb.CreateRelation(relationshipName, parentTableName, _
childTableName, dbRelationDontEnforce)
rel.Fields.Append rel.CreateField(parentTablePkName) ' parent PK
rel.Fields(parentTablePkName).ForeignName = childTableFkName ' child FK
cdb.Relations.Append rel
Set rel = Nothing
Set cdb = Nothing
End Sub
首先,您的 "Cihld"(真的有人将 Child 拼写错了那么严重并将其留在模式中吗???)table 实际上是 parent table,Main table 是 child table,根据定义的关系:子 table 有国外键列被限制为具有来自父 table 的主键值。这种混淆加上拼写错误强烈表明一团糟。
然而,允许将外键列定义为可为空的(即 而不是 使用 NOT NULL
修饰符定义它们)。执行此操作,只需将外键列设置为 NULL
您不想限制回父 table.
的任何行
我有这个关系。我必须暂时销毁它只是为了使用 SQL 命令更改 "salID" 字段的大小:
ALTER TABLE Adressen DROP CONSTRAINT [ChildTableMainTable]
如何使用 SQL 命令重新创建相同的关系类型? 如果我使用下一个 SQL 我得到一个一对多的关系。这不是我需要的:
ALTER TABLE MainTable ADD CONSTRAINT [ChildTableMainTable] FOREIGN KEY (salID) REFERENCES [ChildTable] (ChildPK);
据我所知,Access DDL 根本不支持在没有 "Enforce Referential Integrity" 的情况下创建 Access "Relationship"。 CREATE CONSTRAINT
将创建 with "Enforce Referential Integrity" 关系,因为这正是这种关系的本质:参照完整性 constraint。
(CREATE CONSTRAINT
的 ON UPDATE
和 ON DELETE
子句控制“编辑关系”对话框中 "Cascade Update Related Fields" 和 "Cascade Delete Related Records" 复选框的值,但它们不要控制 "Enforce Referential Integrity" 复选框本身的值。)
换句话说,没有 "Enforce Referential Integrity" 的关系根本不是约束。这只是一个 "hint" 表通过指定的字段相关联,例如,如果将表添加到查询设计中,查询构建器可以自动连接这些表。
要在没有 "Enforce Referential Integrity" 的情况下创建关系,您需要使用 Access DAO。对于这样的关系
VBA 中所需的代码为
Option Compare Database
Option Explicit
Public Sub CreateRelationship(relationshipName As String, _
parentTableName As String, childTableName As String, _
parentTablePkName As String, childTableFkName As String)
Dim cdb As DAO.Database
Set cdb = CurrentDb
Dim rel As DAO.Relation
Set rel = cdb.CreateRelation(relationshipName, parentTableName, _
childTableName, dbRelationDontEnforce)
rel.Fields.Append rel.CreateField(parentTablePkName) ' parent PK
rel.Fields(parentTablePkName).ForeignName = childTableFkName ' child FK
cdb.Relations.Append rel
Set rel = Nothing
Set cdb = Nothing
End Sub
首先,您的 "Cihld"(真的有人将 Child 拼写错了那么严重并将其留在模式中吗???)table 实际上是 parent table,Main table 是 child table,根据定义的关系:子 table 有国外键列被限制为具有来自父 table 的主键值。这种混淆加上拼写错误强烈表明一团糟。
然而,允许将外键列定义为可为空的(即 而不是 使用 NOT NULL
修饰符定义它们)。执行此操作,只需将外键列设置为 NULL
您不想限制回父 table.