2013-04-23 15 views
6

Mam ramki danych w R o 3 kolumny, korzystając sqlSave mogę łatwo stworzyć tabelę w bazie danych SQL:zaktualizować tabelę SQL poprzez R sqlSave

channel <- odbcConnect("JWPMICOMP") 
sqlSave(channel, dbdata, tablename = "ManagerNav", rownames = FALSE, append = TRUE, varTypes = c(DateNav = "datetime")) 
odbcClose(channel) 

Ta ramka danych zawiera informacje o Menedżerów (Nazwa , Nav i Date), które są aktualizowane codziennie o nowe wartości dla bieżącej daty i może stare wartości mogą być aktualizowane również w przypadku błędów.

Jak mogę wykonać to zadanie w R?

I treid używać SQLUpdate ale zwraca mi następujący błąd:

> sqlUpdate(channel, dbdata, tablename = "ManagerNav") 
Error in sqlUpdate(channel, dbdata, tablename = "ManagerNav") : 
    cannot update ‘ManagerNav’ without unique column 
+0

Czy Twoja tabela zawiera klucz podstawowy? Domyślam się, że do tego odnosi się błąd. Może mógłbyś dodać kolumnę indeksu do tabeli z auto_increment i spróbować ponownie. –

+0

Kluczem podstawowym powinna być nazwa menedżera i Nav ... –

+1

Mh, w tym przypadku może "sqlUpdata/sqlSave" nie obsługuje tabel, które mają klucz podstawowy z dwiema kolumnami ?! Czy musisz to inaczej określić? Tylko zgadnij, bo dla mnie błąd brzmi, jakby miał problem z PK. Zastanawiam się tylko, czy twoje polecenie 'sqlSave' ustawia PK tak, jak chcesz. Może nadal możesz to sprawdzić w bazie danych, jeśli jest ona poprawnie ustawiona. –

Odpowiedz

7

Podczas tworzenia tabeli „białego rekina-way” (patrz dokumentacja), to nie otrzyma indeks podstawowy, ale to zwykłe kolumny, a często niewłaściwy typ. Zwykle używam twojego podejścia, aby uzyskać prawidłowe nazwy kolumn, ale potem powinieneś wejść do swojej bazy danych i przypisać główny indeks, poprawne szerokości i typy kolumn.

Po tym, sqlUpdate może działać; Powiem może, bo dałem się używając SQLUpdate, istnieje zbyt wiele ostrzeżenia i używać sqlquery (..., pasty ("Update ....))) dla prawdziwej pracy.

+1

Jak używać sqlQuery (..., paste ("Aktualizacja tabeli SET ...) Mam na myśli dane, które chcę zaktualizować to ramka danych 3 kolumny ... –

+0

Utwórz instrukcję aktualizacji SQL dla każdego wiersza danych ramki przy użyciu paste() ... –

+0

Wydaje się, że nie jest to opłacalne, ponieważ mam kilka wierszy, aby zaktualizować ... –

3

Co zrobiłbym do tego jest następująca

rozwiązanie 1

sqlUpdate(channel, dbdata,tablename="ManagerNav", index=c("ManagerNav"))

rozwiązanie 2

Lcolumns <- list(dbdata[0,]) sqlUpdate(channel, dbdata,tablename="ManagerNav", index=c(Lcolumns))

indeks jest używany do określenia jakie kolumny R ma zamiar zaktualizować. Hope this helps!