So ändern Sie den Spaltendatentyp in PostgreSQL 8.4 von Zeichen in Zahlen

136

Ich verwende folgende Abfrage:

ALTER TABLE presales ALTER COLUMN code TYPE numeric(10,0); 

um den Datentyp einer Spalte von character(20)auf zu ändern , numeric(10,0)aber ich erhalte die Fehlermeldung:

Die Spalte "Code" kann nicht in einen numerischen Typ umgewandelt werden

user728630
quelle

Antworten:

240

Sie können versuchen, Folgendes zu verwenden USING:

Die optionale USINGKlausel gibt an, wie der neue Spaltenwert aus dem alten berechnet wird. Wenn nicht angegeben, entspricht die Standardkonvertierung einer Zuweisung, die vom alten in den neuen Datentyp umgewandelt wurde. Eine USINGKlausel muss angegeben werden, wenn keine implizite oder Zuweisung vom alten zum neuen Typ vorliegt.

Das könnte also funktionieren (abhängig von Ihren Daten):

alter table presales alter column code type numeric(10,0) using code::numeric;
-- Or if you prefer standard casting...
alter table presales alter column code type numeric(10,0) using cast(code as numeric);

Dies schlägt fehl, wenn Sie etwas haben code, das nicht numerisch umgewandelt werden kann. Wenn die USING fehlschlägt, müssen Sie die nicht numerischen Daten von Hand bereinigen, bevor Sie den Spaltentyp ändern.

mu ist zu kurz
quelle
Diese Spalte wird als Fremdschlüssel in einer anderen Tabelle verwendet. Ich denke, ich muss auch den Datentyp ändern.
user728630
2
@ user728630: Sie müssen die FK löschen, beide Spalten ändern und dann die FK wieder hinzufügen. Sie haben eine Testdatenbank zum Spielen und eine Sicherung der Produktionsdatenbank, oder?
Mu ist zu kurz
Ich habe die Fremdschlüsseleinschränkung gelöscht, den Datentyp geändert, aber danach konnte ich die FK nicht hinzufügen. Der folgende Fehler wird angezeigt: FEHLER: Einfügen oder Aktualisieren der Tabelle "Rechnungen" verstößt gegen die Fremdschlüsseleinschränkung "Rechnung_presale_fk" DETAIL: Schlüssel (Verkauf, cpf_cnpj) = (4,05943560000101) ist in Tabelle "Vorverkauf" nicht vorhanden.
user728630
2
@funwhilelost Das ist eine Typumwandlung . Die verknüpften ALTER TABLE-Dokumente beschreiben, was Sie mit USING verwenden können.
Mu ist zu kurz
3
@ Muistooshort Ich sehe aus den Dokumenten, dass es tatsächlich ein Ausdruck ist. Das macht mehr Sinn. Die Typbesetzung überraschte mich. Ich endete mitTYPE varchar(255) USING (substring(formertextcolumn from 1 for 255))
funwhilelost
7

Wenn Ihre VARCHARSpalte leere Zeichenfolgen enthält (die, wie Sie sich vielleicht erinnern, nicht mit NULLPostgreSQL identisch sind ), müssen Sie in der folgenden Zeile etwas verwenden, um einen Standard festzulegen:

ALTER TABLE presales ALTER COLUMN code TYPE NUMERIC(10,0)
            USING COALESCE(NULLIF(code, '')::NUMERIC, 0);

(gefunden mit Hilfe dieser Antwort )

Patru
quelle