访问SQL以创建一对多关系,而不强制引用完整性

访问SQL以创建一对多关系,而不强制引用完整性,sql,ms-access,constraints,Sql,Ms Access,Constraints,我有这种关系。我不得不临时销毁它,只是为了使用SQL命令更改“salID”字段的大小: ALTER TABLE Adressen DROP CONSTRAINT [ChildTableMainTable] 如何使用SQL命令重新创建相同的关系类型? 如果我使用下一个SQL,我会得到一对多关系。这不是我需要的: ALTER TABLE MainTable ADD CONSTRAINT [ChildTableMainTable] FOREIGN KEY (salID) REFERENCES [C

我有这种关系。我不得不临时销毁它,只是为了使用SQL命令更改“salID”字段的大小:

ALTER TABLE Adressen DROP CONSTRAINT [ChildTableMainTable]

如何使用SQL命令重新创建相同的关系类型? 如果我使用下一个SQL,我会得到一对多关系。这不是我需要的:

ALTER TABLE MainTable ADD CONSTRAINT [ChildTableMainTable] FOREIGN KEY (salID) REFERENCES [ChildTable] (ChildPK);

据我所知,Access DDL不支持在没有“强制引用完整性”的情况下创建访问“关系”<代码>创建约束将创建一个具有“强制引用完整性”的关系,因为这正是这种关系的含义:引用完整性约束

创建约束
更新时
删除时
子句控制编辑关系对话框中“级联更新相关字段”和“级联删除相关记录”复选框的值,但它们不控制“强制引用完整性”复选框本身的值。)

换句话说,没有“强制引用完整性”的关系根本不是约束。这仅仅是一个“提示”,表明表是通过指定的字段关联的,例如,如果将表添加到查询设计中,查询生成器可以自动联接表

要创建一个没有“强制引用完整性”的关系,您需要使用accessdao。对于这样的关系

VBA中所需的代码为

选项比较数据库
选项显式
Public Sub CreateRelationship(关系名称为字符串_
parentTableName作为字符串,childTableName作为字符串_
parentTablePkName作为字符串,childTableFkName作为字符串)
Dim cdb作为DAO.Database
设置cdb=CurrentDb
作为道的关系
Set rel=cdb.CreateRelation(relationshipName、parentTableName、_
childTableName,dbRelationDontEnforce)
rel.Fields.Append rel.CreateField(parentTablePkName)'父PK
相关字段(parentTablePkName).ForeignName=childTableFkName'ChildFK
cdb.Relations.Append rel
Set rel=无
设置cdb=无
端接头
首先,根据定义的关系,您的“Cihld”(是否有人真的拼写错了Child并将其留在架构中?)表实际上是父表,主表是子表:子表的外键列被约束为具有来自父表的主键值。这种混乱,再加上拼写错误,强烈表明这是一片混乱


然而,允许将外键列定义为可空(即不使用
notnull
修饰符定义它们)。执行此操作,只需将外键列设置为
NULL
您不想约束回父表的任何行。

我认为,这两个关系都是1对多关系,如底部的编辑关系框所示。。。您可能正在寻找的是在末尾添加
关于更新集NULL关于删除集NULL的
?在我的原始关系中未检查强制引用完整性。在采用了不同的方法之后,我放弃了。如果您希望这些表之间的一对多关系没有引用完整性,那么除了在salID和CLIDPK上连接之外,我想不出其他任何东西,我正在更新一个旧产品,这需要对具有关系的字段进行一些修改。这些关系使我们更容易访问和查看查询中的数据。但是古老而糟糕的数据库设计无法与强制关系一起工作。理想情况下,我更愿意运行一个脚本来更新所述数据库,而不是执行一系列手动步骤或编写单独的应用程序。我知道DAO可以用来自动化这一点,但这是一堆额外的工作(每次更改的代码段),实际上应该只是SQL中的一个关键字(例如NOCHECK)。@Simoyd:如果您修改Gord的函数以表名和字段名作为参数,那么每个关系只有一行代码。