Mysql
 sql >> Base de données >  >> RDS >> Mysql

R et MySQL - vérifier si une ligne existe dans une table avant d'y écrire à l'aide de dbWriteTable()

Envisagez l'une des deux manières suivantes :une solution de déduplication basée sur SQL ou une solution de déduplication basée sur R. Pour le premier, vous auriez besoin d'utiliser une table intermédiaire temporaire qui exécute le classique LEFT JOIN...IS NULL/NOT EXISTS/NOT IN Requête SQL. Pour ce dernier, vous importeriez tout le contenu dans une trame de données, ajouteriez votre df actuel et exécuteriez le unique() de R . Cependant, il semble que vous n'ayez pas l'intention de le faire, mais je le montre pour les futurs lecteurs.

SQL (en utilisant une table temporaire avec la structure exacte de la table de destination)

# 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"))

R (lire dans les données du tableau 2, à considérer si ce n'est pas trop gourmand en ressources, à privilégier si déduplication par toutes les colonnes)

# 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()