我开发了一项在线调查,将我的数据存储在Microsoft SQL 2005数据库中。我在R.编写了一组异常检查我的数据,这些脚本的一般工作流程是:RODBC sqlSave()在违反PK时停止插入查询
-
从SQL数据库的SQLQuery()
- 执行异常值分析
- 写违规的受访者回
- 读数据使用sqlSave()在单独的表数据库
我写回表的结构为:
CREATE TABLE outliers2(
modelid int
, password varchar(50)
, reason varchar(50),
Constraint PK_outliers2 PRIMARY KEY(modelid, reason)
)
GO
如您所见,我已将主键设置为模型和原因。同一个受访者可能是多重检查的异常点,但我不想为任何受访者插入相同的modelid和reason组合。
由于我们仍在收集数据,我希望能够在每天/每周的基础上更新这些脚本,因为我在开发我对数据进行估计的模型。这里是sqlSave()
命令我使用的一般形式:
sqlSave(db, db.insert, "outliers2", append = TRUE, fast = FALSE, rownames = FALSE)
其中db
是一个有效的ODBC连接和db.insert
的形式
> head(db.insert)
modelid password reason
1 873 abkd WRONG DIRECTION
2 875 ab9d WRONG DIRECTION
3 890 akdw WRONG DIRECTION
4 905 pqjd WRONG DIRECTION
5 941 ymne WRONG DIRECTION
6 944 okyt WRONG DIRECTION
sqlSave()
当它试图插入一行扼流圈那违反了主键约束,并且不会继续插入其他记录。我会认为设置fast = FALSE
会缓解这个问题,但事实并非如此。
有关如何解决此问题的任何想法?我可以在第一个脚本的开始处始终使用drop
表格,但这看起来相当笨拙,无疑会导致问题不断出现。
感谢您的提示。我最终采用了一种不同的方法(我将在上面详细介绍),但这让我想到了正确的方向。有一件事我没有把头脑包裹起来,如果我通过管理工作室(比如说10个)运行插入查询,并且第6个插入查询违反了PK,那么SQL Server会对这个声明感到愤怒,但是通常继续陈述7-10。这不是R与SQL交互时的行为。 – Chase 2010-11-17 14:19:15
我相信这是由ODBC连接引起的,它会将更新序列化。直接接口的行为会有所不同。 – Choens 2010-11-18 12:57:53