2012-12-11 59 views
3

而不是追加或覆蓋整個表到數據庫,RMySQL中是否有任何功能可以只更新表的一部分?因爲我們的某些數據有一天可能會不完整,所以我需要保留原來的表格,並且只替換那些有新數據的行,下面是我寫的函數,但沒有用,需要幫助:如何使用RMySQL包更新MySQL表

col.info <- "(id int, timestamp bigint, yyyy int, mm int, dd int, value double, 
PRIMARY KEY(id, timestamp, yyyy, mm, dd))" 

Func <- function(con, tbl.name, dat.set, col.info) { 
    if (dbExistsTable(con, tbl.name)) { 
    dbWriteTable(con, tbl.name, dat.set, row.names=F, append=T); #what can I change the append for?? 

    } else { 
    dbSendQuery(con, paste("CREATE TABLE IF NOT EXISTS", tbl.name, col.info, sep=" ")); 
    dbWriteTable(con, tbl.name, dat.set, row.names=F, append=T); 
    } 
} 

Func(conn_table, "daily_update", df, col.info) 
+0

你可以使用dbSendQuery。你說它不起作用,但是怎麼樣?你有什麼信息?第二我會調用函數像dailyUpdate而不是Func。 – agstudy

+0

我只是再次運行代碼,這次它工作!但是最後一次整個表被重複,我是數據庫的新手,所以如果主鍵在那裏,表不應該有重複的行,我說得對嗎?謝謝。 – Rosa

+0

是的!主鍵在數據行中是唯一的。 – agstudy

回答

-1

我知道這個問題發佈了4年前,但我希望這會幫助其他用戶正在尋找這個答案。

table <- [NAME OF THE TABLE YOU WANT TO UPDATE] 
x <- [YOUR DATA SET] 

# We'll need the column names of the table for our INSERT/UPDATE statement 
rs <- dbSendQuery(con, paste0('SHOW COLUMNS FROM ', table, ';')) 
col_names <- dbFetch(rs) 
dbClearResult(rs) 

# Find which columns are primary keys as we shouldn't need to update these 
pri <- which(col_names$Key == "PRI") 

# For each row in your data frame, build an UPDATE statement and query your db 
for(i in 1:nrow(x)) { 

    # Transform ith row of dataset into character vector 
    values <- sapply(x[i, ], as.character) 

    # Build the INSERT/UPDATE query 
    myquery <- paste0("INSERT INTO ", 
         table, 
         "(", paste(col_names$Field, collapse = ", "), ") ", # column names 
         "VALUES", 
         "('", paste(values, collapse = "', '"), "') ", # new records 
         "ON DUPLICATE KEY UPDATE ", 
         paste(col_names$Field[-pri], values[-pri], sep = " = '", collapse = "', "), # everything minus primary keys 
         "';") 

    # Show full query for clarity 
    cat("Performing query", i, "of", nrow(x), ":\n", myquery, "\n\n") 

    # Send query to database 
    dbSendQuery(con, myquery) 

} 

我只是張貼了我解決這個問題上GitHub如果你正在尋找一個更指導演練。

+0

儘管此鏈接可能會回答問題,但最好在此處包含答案的基本部分,並提供供參考的鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。 - [來自評論](/ review/low-quality-posts/17995673) – mmgross

+0

感謝提示@mmgross,我相應地調整了我的答案。 – RDRR