it-swarm.com.de

Ändern Sie den Typ des Varchar-Felds in Integer: "Kann nicht automatisch in Integer umgewandelt werden"

Ich habe eine kleine Tabelle und ein bestimmtes Feld enthält den Typ "Zeichen variieren". Ich versuche es in "Integer" zu ändern, aber es gibt einen Fehler, dass das Casting nicht möglich ist.

Gibt es einen Weg, dies zu umgehen, oder sollte ich einfach eine andere Tabelle erstellen und die Datensätze mithilfe einer Abfrage in sie einbringen.

Das Feld enthält nur ganzzahlige Werte.

136
itsols

Es gibt keine implizite (automatische) Umwandlung von text oder varchar in integer (dh Sie können einer Funktion, die varchar erwartet, kein integer übergeben). ] oder weisen Sie einem varchar - Feld ein integer - Feld zu. Sie müssen daher eine explizite Besetzung mit ALTER TABLE ... ALTER COLUMN ... TYPE angeben ... USING :

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

Beachten Sie, dass Ihre Textfelder möglicherweise Leerzeichen enthalten. In diesem Fall verwenden Sie:

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

leerraum vor der Konvertierung zu entfernen.

Dies sollte aus einer Fehlermeldung hervorgehen, wenn der Befehl in psql ausgeführt wurde, aber es ist möglich, dass PgAdmin-III Ihnen nicht den vollständigen Fehler anzeigt. Folgendes passiert, wenn ich es in psql unter PostgreSQL 9.2 teste:

=> 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        

Vielen Dank an @muistooshort für das Hinzufügen des Links USING.

Siehe auch diese verwandte Frage ; es geht um Rails Migrationen, aber die zugrunde liegende Ursache ist die gleiche und die Antwort gilt.

219
Craig Ringer

das hat für mich gearbeitet.

ändern Sie die Spalte varchar in 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)'
65
bibangamba

Sie können es wie folgt machen:

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

oder versuchen Sie dies:

change_column :table_name, :column_name, :integer, using: 'column_name::integer'

Wenn Sie mehr über dieses Thema erfahren möchten, lesen Sie diesen Artikel: https://kolosek.com/Rails-change-database-column

11
Nesha Zoric

Versuchen Sie dies, es wird sicher funktionieren.

Wenn Sie Rails migrations schreiben, um eine Zeichenfolgenspalte in eine Ganzzahl umzuwandeln, würden Sie normalerweise sagen:

change_column :table_name, :column_name, :integer

PostgreSQL wird sich jedoch 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" sagt Ihnen im Grunde, dass Sie bestätigen müssen, 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)'

Das oben Genannte ahmt das nach, was Sie von anderen Datenbankadaptern kennen. Wenn Sie nicht numerische Daten haben, sind die Ergebnisse möglicherweise unerwartet (aber Sie konvertieren schließlich in eine Ganzzahl).

7
Subhash Chandra

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

Wenn Sie versehentlich Ganzzahlen mit Textdaten gemischt haben oder nicht, sollten Sie zuerst den folgenden Befehl ausführen (wenn nicht oben, schlägt die Änderung der Tabelle fehl):

UPDATE the_table SET col_name = replace(col_name, 'some_string', '');
1
webrama.pl

Wenn Sie in einer Entwicklungsumgebung arbeiten (oder in einer Produktionsumgebung, bei der es sich möglicherweise um eine Sicherungskopie Ihrer Daten handelt), müssen Sie zuerst die Daten aus dem DB-Feld löschen oder den Wert auf 0 setzen.

UPDATE table_mame SET field_name= 0;

Führen Sie anschließend die folgende Abfrage aus, und führen Sie die Abfrage erfolgreich aus, um das Schema zu migrieren, und führen Sie anschließend das Migrationsskript aus.

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

Ich denke, es wird dir helfen.

0
Sandip Rajput