R和MySQL—在使用dbWriteTable()写入表之前检查表中是否存在行

R和MySQL—在使用dbWriteTable()写入表之前检查表中是否存在行,mysql,r,Mysql,R,我正在使用R包RMySQL和dbConnect将我的R连接到我公司的MySQL数据库。简而言之,我的R脚本连接到MySQL数据库,从数据库中提取一个表(表1),使用该表进行一些分析,然后写入MySQL数据库中的另一个表(表2) 因此,表2不是从数据库中提取出来的,而是需要附加我在R中所做的工作。使用我在R中所做的一些其他分析添加到表中,然后将表重新写入MySQL数据库,在上一个数据库中附加新信息。我当前用于写入表2的代码行是: dbWriteTable(con_hub, value = my_R

我正在使用R包RMySQL和dbConnect将我的R连接到我公司的MySQL数据库。简而言之,我的R脚本连接到MySQL数据库,从数据库中提取一个表(表1),使用该表进行一些分析,然后写入MySQL数据库中的另一个表(表2)

因此,表2不是从数据库中提取出来的,而是需要附加我在R中所做的工作。使用我在R中所做的一些其他分析添加到表中,然后将表重新写入MySQL数据库,在上一个数据库中附加新信息。我当前用于写入表2的代码行是:

dbWriteTable(con_hub, value = my_R_dataframe, name = "table2", append = TRUE, row.names = FALSE)
在写这篇文章之前,我需要确保我的\R\u数据框中没有已经在table2数据库表中的行,因为重复是很难处理的。有人对此有什么建议吗?另外,我不希望把表2从MySQL数据库拉到R中,因为这个查询会给我的代码增加一点时间


谢谢,

考虑两种方法之一:SQL驱动的重复数据消除或R驱动的重复数据消除解决方案。对于前者,您需要使用运行经典SQL查询的临时暂存表。对于后者,您将导入数据帧中的所有内容,附加当前df,并运行R的
unique()
。不过,听起来你们不打算看后者,但我想给未来的读者看

SQL(使用具有目标表精确结构的临时表)

<强> R< /强>(在表2中读取数据,考虑是否对资源太征税,如果所有列的DUP优先)

#检索表2数据

table2df您不能在表2中添加一个索引,以约束条目必须是唯一的吗?是的,我可以,只是不知道如何实现它。表2中有一列是唯一的,不应重复。
# OVERWRITE TEMP EACH TIME
dbWriteTable(con_hub, value = my_R_dataframe, 
                      name = "table2_temp", 
                      overwrite = TRUE,                        
                      row.names = FALSE)

# RUN LEFT JOIN...IS NULL QUERY (COMPARE COLS --COL1, COL2, COL3-- ADD/REMOVE AS NEEDED)
dbSendQuery(con_hub, paste0("INSERT INTO table2", 
                            " SELECT * FROM table2_temp",
                            " LEFT JOIN table2",
                            "   ON table2_temp.col1 = table2.col1", 
                            "   AND table2_temp.col2 = table2.col2",
                            "   AND table2_temp.col3 = table2.col3",
                            " WHERE table2.col1 IS NULL",
                            "   OR table2.col2 IS NULL",
                            "   OR table2.col3 IS NULL"))
# RETRIEVE table2 DATA
table2df <- dbGetQuery(con_hub, "SELECT * FROM table2")

# APPEND BOTH DATAFRAMES
stackeddf <- rbind(table2df, my_R_dataframe)

# RETURN UNIQUE ROWS
finaldf <- unique(stackeddf)

# OVERWRITE DESTINATION TABLE EACH TIME
dbWriteTable(con_hub, value = finaldf, 
                      name = "table2", 
                      overwrite = TRUE,                         
                      row.names = FALSE)

# CLEAN UP ENVIRON OF UNNEEDED OBJECTS
rm(table2df, stackeddf, finaldf)
gc()