插入带和不带 Null 值的外键

Insert foreign key with and without Null value

我在 MS Access 中有一个关系数据库,其中包含 4 个 table:dummyTableTable1, Table2, Table3dummyTable持有别人的外键

现在,为了插入,我使用查询:

INSERT INTO dummyTable (Col1, Col2, Col3, FK_Table1ID, FK_Table2ID, FK_Table3ID)
    SELECT '25' AS Expr1, 'test2' AS Expr2, 2 AS Exp3, Table1.ID, Table2.ID, Table3.ID
    FROM Table1, Table2, Table3
    WHERE (((Table1.dummyName) = 'Germany') 
            AND ((Table2.dummyName) = 'Berlin') 
            AND ((Table3.dummyName) = 'dummyStreet'));

这基本上是选择其他列值并将外键插入到我的主 table (dummyTable) 中。这是有效的。

但问题是这里有些值是可选的。假设我不能有 Table2.dummyName。如果我尝试 ((Table2.dummyName)='')((Table2.dummyName)=Null)。它不插入任何内容/精确插入 0 行但运行成功。

我的查询实际上与后端的 VB.Net 相关联,所以我想在我的参数中发送 DBNull.Value。我也只尝试了选择查询:

SELECT '25' AS Expr1, 'test2' AS Expr2, 2 AS Exp3, Table1.ID, Table2.ID, Table3.ID, Table4.ID
FROM Table1, Table2, Table3
WHERE (((Table1.dummyName)='Germany') AND ((Table2.dummyName)=Null) AND ((Table3.dummyName)='dummyStreet'));

并且它不产生任何行。所以我尝试了:

.....(upper part is the same)
WHERE (((Table1.dummyName)='Germany') AND (IIF(((Table2.dummyName)=Null), Table2.ID = Null, ((Table2.dummyName)='Berlin')) AND ((Table3.dummyName)='dummyStreet'));

但同样,在 Null 的情况下没有插入行,但在 (IIF(((Table2.dummyName)='Berlin'), Table2.ID = Null, ((Table2.dummyName)='Berlin'))

时有效

有人可以帮我吗?我真的被困在这里了。用IIF或者Switch可以吗,还是我完全走错方向了?

如果我对您所做的事情的假设是正确的,那么您的方向就错了。 Access 是关于易用性和快速开发的。我假设 table 1 是国家,table 2 是城市,table 3 是街道,虚拟 table 代表地址的多对多关系。看起来您还打算使用访问权限来进行数据输入。在这种情况下,最好的方法是首先制作适当的 tables,然后转到访问功能区并 selecting 数据库工具关系。建立以下一组规范化关系。

如果我们首先建立关系,Access 有时会更好地自动创建我们输入数据所需的表单。下一步是创建用于插入和更新数据的表单。 select 地址 table 如图所示,然后单击功能区上的创建表单,Access 将自动创建一个数据输入表单,您可以在其中 更新 插入 空值,无需代码。要使地址 table 中的单元格为空,只需清空相应的表格单元格,反之亦然。不幸的是,该表格需要一些工作才能使其更加用户友好。我们想要这样的表格:

我们可以从城市(组合框)等项目的合法值中 select 以及我们可以更新当前记录或通过循环经过最后一条记录(黄色圆圈底部)插入新记录的地方。但访问默认为:

所以删除地址框,因为 Access 在幕后处理 ID,用户永远不需要看到它们。调整标签并将外键变成显示人类可读值的组合框。例如右键单击城市和 select 更改为组合框。然后调整以下设置:

现在我们可以添加新地址,但不能添加新城市和国家。要创建表格以添加新城市,只需点击城市 table 并再次点击创建表格。您将获得一个用于添加和更新城市的表单,并且由于设置了关系访问甚至会创建一个子表单,您可以在其中同时添加地址。如果您不喜欢它,我建议您删除子表单。table。调整你的新城市形式以适应你对地址所做的:

好吧,事实证明你可以。不管它是不是最好的。代码:

INSERT INTO dummyTable (Col1, Col2, Col3, FK_Table1ID, FK_Table2ID, FK_Table3ID)
    SELECT Top 1 '25' AS Expr1, 'test2' AS Expr2, 2 AS Exp3, 
      IIf(((Select t1.ID From Table1 t1 Where Exists (SELECT t1.ID FROM Table1 t1 WHERE 
       t1.dummyName = 'Germany') AND t1.dummyName = 'Germany') Is Null),t1.ID=Null,(Select 
       t1.ID From Table1 t1 Where t1.dummyName = 'Germany')) AS TableOne,
      IIf(((Select t2.ID From Table2 t2 Where Exists (SELECT t2.ID FROM Table2 t2 WHERE 
       t2.dummyName = 'Berlin') AND t2.dummyName = 'Berlin') Is Null),t2.ID=Null,(Select 
       t2.ID From Table2 t2 Where t2.dummyName = 'Berlin')) AS TableTwo,
      IIf(((Select t3.ID From Table3 t3 Where Exists (SELECT t3.ID FROM Table3 t3 WHERE 
       t3.dummyName = 'dummyStreet') AND t3.dummyName = 'dummyStreet') Is 
       Null),t3.ID=Null,(Select t3.ID From Table3 t3 Where t3.dummyName = 'dummyStreet')) 
       AS TableThree
    FROM Table1 As t1, Table2 As t2, Table3 As t3;

请记住,这只是一个虚拟代码,所以我没有负担得起参数。强烈建议不要这样做。