如何解决MS Access中的复合键冲突问题

时间:2014-08-14 03:42:35

标签: sql ms-access foreign-keys composite-key

我的Access数据库(2007)有四个表;客户,供应商,帐户和AccountAgeing

AccountAgeing有一个复合键,由其他两个表的外键和一个日期组成。即;

AsAtDate,SupplierID,AccountNumber

我通过临时表从excel导入数据,我的父表(客户,供应商,帐户)导入得很好。

但是,从我的tempTable导入AccountAgeing持续存在密钥违规。在749种可能的进口中,746违反了该关键。要测试的查询是:

SELECT DISTINCT tempTable.[SupplierID], #31/7/14#, tempTable.[AccountNumber]
       FROM tempTable;

这返回了749条记录(全部)。如果是这种情况,我如何进行密钥违规?

复合关键字段都已编制索引,重复数据正常。目标表中没有数据 These are the indices on my table (obviously I have simplified the names in my question 我有日期和[帐号]索引,因为搜索将在这些字段上。

3 个答案:

答案 0 :(得分:1)

以下是您可以尝试的一系列故障排除步骤。

  1. 从目标表中删除主键并填充它。如果您无法填充目标表,则您的问题可能不是密钥本身,并且可能会根据您收到的错误消息而变得明显。
  2. 如果目标表确实填充,请尝试将所需的复合键添加到已填充的目标表中。
  3. 如果您无法添加密钥,请在填充的目标表上重新运行“select distinct”查询。
  4. 如果您没有选择749个不同的行,请直观地检查表格内容,看看发生了什么。
  5. 这些步骤可以引导您获得一些见解。只是一个猜测 - 但听起来你可能有某种数据类型不匹配。在这种情况下,Access有时会动态转换数据并插入它而不会出错。但在此过程中,数据的性质会发生变化,从而导致目标表中的密钥违规。

    我很想听听你发现了什么。当你弄清问题是什么时,请发表评论。

    希望它有所帮助。祝你好运。

答案 1 :(得分:1)

谢谢马蒂!我试图手动填充,这是错误的,因为在Customers表中没有匹配的记录。

我发现我错误地将AccountAgeing指定为客户的父级,而不是客户的父级。

业务逻辑是AccountAgeing记录将始终具有帐户,但AccountAgeing记录并不总是提及公司编号(Customer表的主键)。

修复程序将Account Aging组合键的一部分绑定到Accounts复合键。

enter image description here

我不确定当我添加一个帐号但没有公司号的ATBRecord时会发生什么,但这是另一个问题

答案 2 :(得分:0)

检查表属性中的Indexed属性 - 确保在任何复合键字段上没有设置为Duplicates OK