MS Access是否会抑制插入中的主键冲突?

时间:2011-08-18 23:13:51

标签: sql ms-access primary-key

我正在将MS Access数据库重写到SQL服务器,并在Access中发现了一个奇怪的问题,我希望有人可以提供帮助。

我有一个表,我们将其称为'Main',并在索引的帐户上使用主键,并且不允许重复。看起来很简单,但是当数据被插入时我的问题就出现了。

我的INSERT查询是(为简洁而限制字段数量)

INSERT INTO Main (Account, SentDate, Amount)
SELECT C.Account, C.SentDate, C.Amount
FROM 
    (CALLS C LEFT JOIN Bals B ON C.Account = B.ACCT_ID) 
LEFT JOIN AggAnt A ON C.Account = A.Account

问题在于,如果我运行查询的SELECT部分,我会获得2365条记录,但是当我运行INSERT时,我会得到2364条记录。所以我做了一些检查,发现一个帐户重复,记录之间的区别是SentDate和Amount。但是Access只插入其中一条记录而不会抛出任何类型的错误消息或任何内容。查询中没有任何内容表示选择最近的日期等。

示例数据:

Account    SentDate   Amount
12345678   8/1/2011   123.00
23456789   8/1/2011   45678.00
34567890   8/1/2011   7850.00
45678912   8/1/2011   635.00
45678912   5/1/2011   982.00
56789123   8/1/2011   2639.00

在示例中,当我运行INSERT时,我有一个重复的帐户45678912,我没有错误,我从2011年8月1日获得了记录。

为什么Access在违反桌面PK时不会抛出错误? Access中是否有一些怪癖选择一条记录而只跳过另一条记录?

我完全被这个问题困扰所以任何帮助都会很棒。

3 个答案:

答案 0 :(得分:5)

您是如何运行查询的?如果您使用的是DoCmd.RunSQL,请切换到使用DAO数据库对象的.Execute方法,并使用dbFailOnError

Dim db As DAO.Database
Dim strInsert As String
strInsert = "your insert statement"
Set db = CurrentDb
db.Execute strInsert, dbFailOnError
Set db = Nothing

编辑:如果Main是指向SQL Server表的ODBC链接,我会在db.Execute strInsert, dbFailOnError之后检查Errors Collection (DAO)

答案 1 :(得分:2)

  

在访问[更新]一条记录时是否有一些怪癖,只是跳过了   其他

是的,您可以在引擎级别控制此行为(如果使用OLE DB,也可以在记录集级别控制)。

对于OLE DB(例如ADO),设置为Jet OLEDB:Global Partial Bulk Ops

  

确定SQL DML批量时Jet数据库引擎的行为   操作失败。设置为允许部分完成批量   操作,因为某些操作可能会发生不一致的更改   记录可能成功,其他人可能会失败。当设置为允许否   部分完成批量操作,所有更改都会回滚   发生一个错误。 Jet OLEDB:全局部分批量操作   可以在per- Recordset 的基础上覆盖属性设置   设置 Jet OLEDB:Partial Bulk Ops 属性   属性 Recordset 对象的集合。

请注意,默认设置是不允许部分完成批量操作。

答案 2 :(得分:2)

在HansUp指向我检查SetWarnings = false的方向之后。我发现它隐藏在我的代码中,这就是为什么没有关于由于主键违规而未插入记录的警告信息。

要注意的是确保您希望抑制这些消息。

相关问题