Mysql
 sql >> Baza danych >  >> RDS >> Mysql

R i MySQL - sprawdzanie, czy wiersz istnieje w tabeli przed zapisaniem do niej za pomocą dbWriteTable()

Rozważ jeden z dwóch sposobów:rozwiązanie deduplikacji oparte na języku SQL lub rozwiązanie deduplikacji oparte na języku R. W przypadku tego pierwszego potrzebujesz użyć tymczasowej tabeli pomostowej, która uruchamia klasyczną LEFT JOIN...IS NULL/NOT EXISTS/NOT IN Zapytanie SQL. W drugim przypadku zaimportujesz całą zawartość w ramce danych, dopiszesz swój bieżący plik df i uruchomisz unique() w języku R . Wygląda jednak na to, że nie zamierzasz tego ostatniego, ale pokażę przyszłym czytelnikom.

SQL (używając tabeli tymczasowej z dokładną strukturą tabeli docelowej)

# 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 (przeczytaj dane w tabeli 2, rozważ, jeśli nie jest to zbyt opodatkowanie zasobów, preferowane, jeśli usuwasz duplikaty we wszystkich kolumnach)

# 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Czy możliwe jest rzutowanie DECIMAL na DOUBLE w MySQL?

  2. Nieprawidłowa wartość ciągu:'\xE2\x80\xAF(fo...' dla kolumny 'opis' w wierszu 1 Błąd:INSERT INTO moja_nazwa_tabeli

  3. Aktualizowanie rangi w tabeli

  4. Pierwsze kroki z GearHost do tworzenia baz danych MySQL

  5. MySQL:Wstaw wiele wierszy o tej samej wartości AI