我開發了一項在線調查,將我的數據存儲在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