Schrift
[thread]3573[/thread]

datentyp ändern klappt nicht

Leser: 2


<< >> 10 Einträge, 1 Seite
supersucker
 2005-05-20 21:07
#33276 #33276
User since
2005-03-17
118 Artikel
BenutzerIn
[default_avatar]
Hi,

ich hab eine postgresql-db (v.8) die eine tabelle mit 15 spalten enthält. von diesen 15 spalten sind 4 vom typ float. nun möchte ich diese 4 spalten vom typ float zum typ numeric (15,2) ändern, also mit 15 stellen vor dem komma und 2 stellen nach dem komma.

wenn ich nun folgendes einfaches statement ausführe:

Code: (dl )
alter table fraglib alter column x type numeric(15,2);


oder

Code: (dl )
alter table fraglib alter column x type numeric;


kriege ich die fehlermeldung:

Code: (dl )
ERROR:  syntax error at or near "TYPE" at character 36


was ich nicht verstehe, weil wenn ich

Code: (dl )
alter table fraglib alter column x type numeric(15,2);


auf meiner datenbank zuhause ausführe klappt.
die datenbank auf der es nicht klappt, ist ca. 17 GB gross, die bei mir daheim ist nur ein paar hundert MB gross und enthält zu testzwecken einen auszug der grossen datenbank, die beiden datenbanken sind also bis auf die menge der enthaltenen datensätze exakt identisch....

auch ist mir nicht klar warum ich einen syntax-error erhalte, dass heisst doch eigentlich das schon beim parsen des statements irgendwas schiefläuft, das kann aber nicht sein, da es ja wie schon gesagt bei der kleinen db auch klappt.
eine andere möglichkeit wäre das er beim ausführen des statements irgendwann auf einen datensatz trifft den er nicht von float zu numeric umwandeln kann, aber warum krieg ich dann einen syntaxfehler?

oder kann es sein das wenn in einem der float-felder ein null-value drinsteht er das dann nicht zu numeric umwandeln kann? ein null-value in den float-feldern ist in der grossen datenbank wahrscheinlich in einigen datensätzen der fall, aber umwandeln müsste er es doch trotzdem können....

und wenn ich sowas mache wie

Code: (dl )
alter table fraglib alter column x type numeric;


kann es ja auch nicht an den float-werten liegen weil die dann ja 1:1 in numeric übernommen werden....

danke für jede hilfe.......
GwenDragon
 2005-05-20 21:51
#33277 #33277
User since
2005-01-17
14748 Artikel
Admin1
[Homepage]
user image
Syntax für ALTER TABLE unter
http://www.postgresql.at/de/docs/sql-altertable.html


Quote
alter table fraglib alter column x type numeric;

Geht sowas?
Code: (dl )
ALTER TABLE fraglib MODIFY x NUMERIC
\n\n

<!--EDIT|GwenDragon|1116611952-->
supersucker
 2005-05-20 22:24
#33278 #33278
User since
2005-03-17
118 Artikel
BenutzerIn
[default_avatar]
nein,

Quote
ALTER TABLE fraglib MODIFY x NUMERIC


geht leider auch nicht

und der link hat mir auch nicht weitergeholfen, denn die syntax hab ich mir 1:1 aus dem postgresql-manual abgeschrieben......

und an der syntax kann es ja auch nicht liegen wenn das gleiche statement bei einer bis auf die grösse exakt identischen datenbank klappt (s.o.)

noch irgendwelche ideen?
GwenDragon
 2005-05-20 22:33
#33279 #33279
User since
2005-01-17
14748 Artikel
Admin1
[Homepage]
user image
War nur ein Tipp mit dem Link ;)

* Sind auf beiden Rechnern die Datenbanken von der gleichen Versionsnummer?
* Hast du das Recht, die Datenbank zu ändern?
supersucker
 2005-05-20 23:17
#33280 #33280
User since
2005-03-17
118 Artikel
BenutzerIn
[default_avatar]
Quote
* Hast du das Recht, die Datenbank zu ändern?

ja

Quote
* Sind auf beiden Rechnern die Datenbanken von der gleichen Versionsnummer?

nein

wollte das kürzen der nachkommastellen der float-felder gerade mit round(x,2) machen, den round - befehl scheint die datenbank nicht zu kennen, kann also nicht die neueste version (8) sein die ich am laufen hab...
wie kann ich denn über ssh rauskriegen welche datenbank-version da läuft?
im psql-manual steht dazu nichts drin, und ich hab keine root-rechte auf dem rechner, komm also über mein heim-verzeichnis nicht raus...

danke soweit für die hilfe
Gast Gast
 2005-05-21 00:08
#33281 #33281
Öhm. "man psql" sagt bei mir u.a.
"-V, --version
Shows the psql version."
supersucker
 2005-05-21 00:27
#33282 #33282
User since
2005-03-17
118 Artikel
BenutzerIn
[default_avatar]
ok,

ein

Code: (dl )
select version();


hilft weiter.....:-)

ist version 7.4.1, laut doku kann round() nur numerics auf gegebene anzahl von nachkommastellen runden, das man auch floats auf eine gegebene anzahl von nachkommastellen runden kann, scheint ein feature der 8-version zu sein.

warum allerdings

Code: (dl )
alter table fragment alter column x type numeric(15,2);


nicht geht weiss ich immer noch nicht, hab allerdings in der 7.4.1-doku dafür im gegensatz zu 8-doku auch kein beispiel gefunden.......

kann ich mir aber irgendwie nicht vorstellen, dass das erst in v.8 kam, dann hätte ich ja gar keine andere wahl als die datenbank nochmal komplett neu einzuspielen....

irgendwelche ideen?
supersucker
 2005-05-22 22:14
#33283 #33283
User since
2005-03-17
118 Artikel
BenutzerIn
[default_avatar]
ok,

dafür dass mir bisher keiner geantwortet hat, kann es nur zwei gründe geben:

1. keiner weiss es bzw. kann drauf antworten
2. ich hab meine frage besch.... gestellt

da ich mal hoffe das es 2. war, versuch ich mal das etwas sauberer zu formulieren:

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:

Code: (dl )
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:

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


erhalte ich ein:

Code: (dl )
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

Code: (dl )
update fragment set x = round(x,2);


da kriege ich aber die fehlermeldung:

Code: (dl )
1
2
3
4
 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?
supersucker
 2005-05-23 04:27
#33284 #33284
User since
2005-03-17
118 Artikel
BenutzerIn
[default_avatar]
so,

hab jetzt nach stundenlangem googlen rausgefunden, dass man in postgresql (bis v.8, ab der geht es dann) bei einer bereits vorhandenen tabelle NICHT den datentyp ändern kann. toll.

hab also jetzt folgende lösung (gezwungenermaßen) gewählt:

Code: (dl )
1
2
3
4
5
6
7
alter table fragment add column x_new numeric(15,2);

update fragment set x_new = x;

alter table fragment drop column x;

alter table fragment rename column x_new to x;


feine sache, dass dauert auf meiner 17 GB grossen db ungefähr ein halbes jahr.........\n\n

<!--EDIT|supersucker|1116808286-->
Crian
 2005-05-23 15:18
#33285 #33285
User since
2003-08-04
5870 Artikel
ModeratorIn
[Homepage]
user image
Dann lass es über das kommende lange Wochenende laufen ;)
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
<< >> 10 Einträge, 1 Seite



View all threads created 2005-05-20 21:07.