sql >> Database teknologi >  >> RDS >> Mysql

R og MySQL - kontrollerer, om der findes en række i en tabel, før du skriver til den ved hjælp af dbWriteTable()

Overvej en af ​​to måder:en SQL-drevet de-dupe- eller R-drevet de-dupe-løsning. For førstnævnte skal du bruge en midlertidig, mellemstationstabel, der kører den klassiske LEFT JOIN...IS NULL/NOT EXISTS/NOT IN SQL-forespørgsel. For sidstnævnte vil du importere alt indhold i en dataramme, tilføje din nuværende df og køre R's unique() . Det lyder dog som om, du ikke har til hensigt det sidste, men jeg viser det til fremtidige læsere.

SQL (ved hjælp af en midlertidig tabel med nøjagtig struktur af destinationstabellen)

# 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 (læs data i tabel2, overvej, om det ikke er for beskatning af ressourcer, foretrækkes, hvis du deduperer i alle kolonner)

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



  1. Laravel Veltalende med()-> returnerer null

  2. Se om en tabel har en DEFAULT Constraint i SQL Server ved hjælp af OBJECTPROPERTY()

  3. dblink bruger ikke .pgpass-filen

  4. Sådan installeres MySQL c++-driver på Windows