RODBC: sqlUpdate () erkennt die Indexspalte nicht

9

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:

%Vor%

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:

%Vor%

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.

    
AnjaM 14.08.2012, 08:42
quelle

3 Antworten

1

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:

%Vor%

Beachten Sie, dass intable auf cname und coldata aufruft.

    
y g 07.03.2016 19:48
quelle
0

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:

%Vor%

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%     
Wyatt Shipman 04.08.2015 22:05
quelle
0

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)

    
Ryan Barnhart 22.02.2017 15:36
quelle

Tags und Links