Meine Datenbanktabelle sieht ungefähr so aus:
%Vor%Die erste Spalte (ID1) ist als PK definiert. ID2 ist jedoch auch einzigartig.
Nun möchte ich FilePath2
und Status
mit R ändern können, indem ich sqlUpdate()
von RODBC
package verwende. Also versuche ich Folgendes:
Dabei ist db.df
ein Datenrahmen mit einem Zeilen- und Spaltennamen, der dem in der Datenbanktabelle entspricht (allerdings lasse ich einige der Spalten weg, in diesem Fall FilePath1
, und ich würde es vorziehen, sie wegzulassen ID1
auch, wenn möglich). Mein Ziel ist folgendes:
Ich bekomme den folgenden Fehler:
%Vor%Was könnte der Grund für dieses Problem sein?
EDIT: Ich habe das Problem umgangen, indem ich eine direkte SQL-Abfrage gesendet habe:
%Vor% Obwohl das vielleicht kein ordentlicher Weg ist, tut es doch, was es tun soll. Allerdings verstehe ich immer noch nicht, was mit sqlUpdate
los ist, also hoffe ich, dass jemand etwas darüber herausfinden kann.
Ich habe ein ähnliches Problem bei der Verwendung von sqlUpdate
zur Aktualisierung einer Tabelle in MySQL festgestellt. Ich habe es behoben, indem ich die Attribute case
in der R-MySQL-Verbindung gesetzt habe.
Hier ist das Detail:
In MySQL:
%Vor%In R:
%Vor%Der Grund ist, dass die (Standard?) Attribute in RMySQL-Verbindung:
%Vor% Also, colname myName1
in myDF wird in myname1
in sqlUpdate
geändert, also stimmt es nicht mit myName1
index überein.
Beachten Sie, dass es nicht funktioniert, wenn Sie den Aufruf mit index = 'myname1'
ändern. Ein Fehler von index column(s) myName1 not in database table
wird gemeldet. Weil in der MySQL-Tabelle der Spaltenname meinName ist.
Die Lösung besteht darin, die Fallattribute bei oder nach der Verbindung auf "nicht ändern" zu setzen:
%Vor%Hier sind weitere Details:
debugonce(sqlUpdate)
gibt:
Beachten Sie, dass intable
auf cname
und coldata
aufruft.
Das sqlUpdate funktionierte für mich. das einzige, was ich ändern musste, war db.df - ich brauchte das \
-Zeichen zu verdoppeln, damit es nicht versuchte, den Code damit zu umgehen. Mein Testtisch sah so aus:
Ich konnte das Update ohne die Felder ID1 oder FilePath1 im Update ausführen. Wenn Sie die Dokumentation (? SqlUpdate) lesen, heißt es: ' Zuerst sucht es nach einem Primärschlüssel für die Tabelle und dann nach den Spalten, die die Datenbank als optimal für die eindeutige Definition einer Zeile ansieht " Sie müssen also nicht den Primärschlüssel verwenden. Wenn Sie jedoch nicht wussten, dass ID2 eindeutig ist, empfiehlt es sich, diesen Primärschlüssel zu verwenden.
%Vor%In einigen Fällen, insbesondere wenn Sie mehrere Spalten übergeben, müssen Sie die Spaltenstruktur explizit als Spaltennamen angeben.
Beispiel: sqlUpdate (myconn, db.df, tablename = 'mytable', index = Namen ('ID2'), verbose = TRUE)
Update: So scheint es manchmal immer noch fehlschlägt. Die neue Arbeit, die ich verwendete, ist:
Damit können Sie bei Bedarf eine Spaltenliste übergeben. Ich weiß nicht, warum es in der anderen Richtung knifflig war.
indexNames & lt; -Liste ("ID2")
sqlUpdate (myconn, db.df, Tabellenname = 'mytable', index = als.Zeichen ("ID2"), verbose = TRUE)