PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : datentyp-konversion in postgresql 7.4.1



supersucker
22-05-2005, 19:10
Hi zusammen!

ich hab zwei datenbanken die eine ist postgresql 8, die andere postgresql 7.4.1.
vom inhalt her sind die beiden datenbanken völlig identisch, beide enthalten eine einzige tabelle mit denselben attributen. der einzige unterschied ist die grösse, die postgresql-db v. 8 ist meine testdatenbank die nur ein paar 1000 datensätze enthält, die 7.4.1 läuft auf einer remote-maschine und enthält mehrere milliarden datensätze.

nun hab ich folgendes problem:

die tabelle die in beiden datenbanken vom aufbau her identisch ist, enthält 4 attribute die vom typ float sind. Jetzt möchte ich den typ der 4 attribute von float zu numeric(15,2) ändern, so das ich also in den 4 feldern nur noch fliesskommazahlen habe mit 15 erlaubten vorkommastellen und 2 erlaubten nachkommastellen.

hab also folgendes gemacht:



alter table fragment alter column y type numeric(15,2);


das klappt auch wunderbar auf meiner test-datenbank (also v.8), aber nicht auf der 7.4.1-db!
probiere ich hier das gleiche wie bei der v.8, also:



alter table fragment alter column y type numeric(15,2);


erhalte ich ein:



ERROR: syntax error at or near "type" at character 37


dies scheint also in der 7.4.1 nicht zu gehen, hab auch in der 7.4.1-doku dafür im gegensatz zu 8-doku kein beispiel gefunden, bei dem durch dieses kommando der typ eines attribures geändert werden kann......

habs dann mit folgender notlösung probiert:

ich runde einfach alle in den feldern vorhandenen floats auf 2 stellen nach dem komma (ist unsauber, ich weiss, war nur die absolute notlösung....), also mit



update fragment set x = round(x,2);


da kriege ich aber die fehlermeldung:



update fragment set y = round(y,1);
ERROR: function round(double precision, integer) does not exist
HINT: No function matches the given name and argument types.
You may need to add explicit type casts.


hab dann in der doku nachgekuckt und gesehen, dass das mit round so wie oben nur klappt wenn der typ des feldes das gerundet werden soll ein numeric ist....bin also wieder da wo ich angefangen hab.....



wenn ich mit alter nicht den typ ändern kann, wie dann?
hab auch schon in der postgresql-doku das type-cast kapitel durchgelesen, da stand aber auch nichts drin was mir weitergeholfen hat......aber irgendwie muss das ja gehen, es kann ja eigentlich nicht sein das ich in der 7.4.1 version den datentyp nicht von float nach numeric ändern kann.....
gibt es denn noch andere möglichkeiten explizit zu type-casten?

kann mir jemand damit weiterhelfen? ich komme echt nicht weiter....

danke im voraus!

Christoph
23-05-2005, 10:50
Ich bin erstaunt, dass eine Datentyp-Änderungen in PostgreSQL 8.0 geht. In Version 7.4 kannst Du wie folgt vorgehen:

1) neue Spalte vom Zieltyp hinzufügen
2) Daten aus alter Spalte in neu Spalte kopieren (mit UPDATE und ggf. CAST, ROUND oder so)
3) alte Spalte löschen
4) neue Spalte in alte umbenennen

Achtung: Wenn auf der Tabelle Trigger defineirt sind, musst diese danach neu kompilieren.