Tar*_*ryn 5 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
Run Code Online (Sandbox Code Playgroud)
问题是,如果我运行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
Run Code Online (Sandbox Code Playgroud)
在示例中,当我运行INSERT时,我有一个重复的帐户45678912,我没有错误,我从2011年8月1日获得了记录.
为什么Access违反表中的PK时不会抛出错误?在Access中是否有一些怪癖选择一条记录而只是跳过另一条记录?
我完全被这个问题困扰所以任何帮助都会很棒.
你是如何运行查询的?如果您正在使用DoCmd.RunSQL,请切换到使用.ExecuteDAO数据库对象的方法,然后使用dbFailOnError.
Dim db As DAO.Database
Dim strInsert As String
strInsert = "your insert statement"
Set db = CurrentDb
db.Execute strInsert, dbFailOnError
Set db = Nothing
Run Code Online (Sandbox Code Playgroud)
编辑:如果主要是一个ODBC连接到SQL Server表,我会检查Errors集合(DAO)后db.Execute strInsert, dbFailOnError
在 HansUp 指示我检查 SetWarnings = false 的方向之后。我发现它埋在我的代码中,这就是为什么没有关于由于主键违规而未插入记录的警告消息。
需要注意的是,请确保您希望抑制这些消息。