2012-11-01 8 views
112

Ich habe eine kleine Tabelle und ein bestimmtes Feld enthält den Typ "Charakter variierend". Ich versuche, es in "Integer" zu ändern, aber es gibt einen Fehler, dass Casting nicht möglich ist.Ändere den Typ des varchar-Felds in Integer: "kann nicht automatisch in den Integer-Typ umgewandelt werden"

Gibt es einen Weg um dies oder sollte ich nur eine andere Tabelle erstellen und die Datensätze mithilfe einer Abfrage in sie einfügen.

Das Feld enthält nur ganzzahlige Werte.

+0

Welche spezifische ALTER TABLE haben Sie versucht und was war die spezifische Fehlermeldung? –

+0

@muistooshort Ich versuchte mit alter von phppgadmin. Markieren Sie die Spalte und versuchen Sie, den neuen Feldtyp einzugeben. Der Fehler ist: 'SQL-Fehler: Fehler: Spalte" MID "kann nicht umgewandelt werden, um Integer einzugeben" – itsols

+3

Zuerst ist Backup-Tabelle. Dann können Sie eine andere Spalte (zB field2) vom Integer-Typ in derselben Tabelle erstellen. Wählen Sie in Feld2 den Wert für den Cast in Integer des Felds1 aus. Benenne dann die Spalte um. – Igor

Antwort

173

Es gibt keine implizite (automatisch), gegossen aus text oder varchar-integer (dh Sie können keine varchar auf eine Funktion erwartet integer oder zuordnen varchar Feld zu einer integer ein Pass), so dass Sie eine explizite Umwandlung mit ALTER TABLE ... ALTER COLUMN ... TYPE ... USING angeben müssen :

ALTER TABLE the_table ALTER COLUMN col_name TYPE integer USING (col_name::integer); 

Beachten Sie, dass Sie möglicherweise Leerzeichen in Ihren Textfeldern haben; In diesem Fall verwenden Sie:

ALTER TABLE the_table ALTER COLUMN col_name TYPE integer USING (trim(col_name)::integer); 

, um Leerzeichen vor der Konvertierung zu entfernen.

Dies sollte durch eine Fehlermeldung offensichtlich sein, wenn der Befehl in psql ausgeführt wurde, aber es ist möglich, PgAdmin-III zeigt Ihnen nicht den vollständigen Fehler. Hier ist, was passiert, wenn ich es in psql auf PostgreSQL 9.2 testen:

=> CREATE TABLE test(x varchar); 
CREATE TABLE 
=> insert into test(x) values ('14'), (' 42 '); 
INSERT 0 2 
=> ALTER TABLE test ALTER COLUMN x TYPE integer; 
ERROR: column "x" cannot be cast automatically to type integer 
HINT: Specify a USING expression to perform the conversion. 
=> ALTER TABLE test ALTER COLUMN x TYPE integer USING (trim(x)::integer); 
ALTER TABLE   

Dank @muistooshort zum Hinzufügen des USING Link.

Siehe auch this related question; Es geht um Rails-Migrationen, aber die zugrunde liegende Ursache ist dieselbe und die Antwort trifft zu.

+0

Vielen Dank, dass Sie sich die Zeit genommen haben. Aber ich kann das nicht funktionieren sehen. Ich habe versucht, Ihre ALTER-Zeile und es gibt mir einen Fehler "Syntax Fehler in der Nähe von" – itsols

+0

Meine Aussage: ALTER TABLE "tblMenus" ALTER SPALTE "MID" VERWENDUNG (trim ("MID") :: ganze Zahl); – itsols

+1

@itsols Völlig mein Fehler; Ich korrigierte es, als ich deinen Kommentar sah. Siehe überarbeitet. Es war richtig im Demo-Code, nur nicht das generische Beispiel am Anfang. –

0

Wenn Sie versehentlich haben oder nicht gemischt ganze Zahlen mit Textdaten, die Sie auf dem ersten sollten unter Update-Befehl ausführen (wenn nicht obige Tabelle ändern wird fehlschlagen):

UPDATE the_table SET col_name = replace(col_name, 'some_string', ''); 
+2

Sie wären besser dran mit etwas wie 'regexp_replace (col_name,' [^ 0-9.] ',' ',' G ') 'wenn Sie versuchen, unerwünschte Zeichen und Leerraum zu entfernen . Sie würden etwas anspruchsvolleres brauchen, wenn Sie die wissenschaftliche Schreibweise "NaN" und "Inf" und "10E42" beibehalten möchten. –

55

this für mich gearbeitet.

Änderung varchar Spalte int

change_column :table_name, :column_name, :integer 

bekam:

PG::DatatypeMismatch: ERROR: column "column_name" cannot be cast automatically to type integer 
HINT: Specify a USING expression to perform the conversion. 

chnged zu

change_column :table_name, :column_name, 'integer USING CAST(column_name AS integer)' 
+0

haben Sie diese Übung mit Daten versucht und waren Ihre Daten intakt? – itsols

+3

solange was in der Spalte ist eine ganze Zahl, ja – bibangamba

+0

Es funktioniert nicht mit mir. Ich benutze Ruby 2.2.3 mit Schienen 4.2.3 –

0

Wenn Sie auf Entwicklungsumgebung (oder für die Produktion env arbeiten es kann. Sichern Sie Ihre Daten), dann löschen Sie zuerst die Daten aus dem DB-Feld oder setzen Sie den Wert auf 0.

UPDATE table_mame SET Feldname = 0;

Danach, um die folgende Abfrage und nach der erfolgreichen Ausführung der Abfrage ausführen, um die Schemamigration und danach das Skript migrieren.

ALTER TABLE tabelle_mame ALTER COLUMN field_name TYPE numerisch (10,0) USING field_name :: numeric;

Ich denke, es wird Ihnen helfen.

6

Versuchen Sie es, es wird sicher funktionieren.

Wenn Rails Migrationen Schreiben eines String-Spalte in eine ganze Zahl konvertieren würde man normalerweise sagen:

change_column :table_name, :column_name, :integer 

Allerdings wird PostgreSQL beschweren:

PG::DatatypeMismatch: ERROR: column "column_name" cannot be cast automatically to type integer 
HINT: Specify a USING expression to perform the conversion. 

Der "Hinweis" im Grunde sagt, dass Sie müssen bestätigen, dass dies geschehen soll und wie Daten konvertiert werden sollen. Sagen Sie dies einfach in Ihrer Migration:

change_column :table_name, :column_name, 'integer USING CAST(column_name AS integer)' 

Die oben genannten werden nachahmen, was Sie von anderen Datenbankadaptern wissen. Wenn Sie nicht-numerische Daten haben, sind die Ergebnisse möglicherweise unerwartet (aber Sie konvertieren schließlich in eine ganze Zahl).

1

Ich habe das gleiche Problem. Dann erkannte ich, dass ich einen Standard-String-Wert für die Spalte hatte, die ich ändern wollte. Durch das Entfernen des Standardwerts ist der Fehler verschwunden :)

Verwandte Themen