steffen: in postgres datentypen ändern

Hi,

ich habe in einer postgres datenbank eine tabelle test mit dem feld wort, das den datentyp varchar hat.
wie kann ich den datentyp ändern? möchte, dass wort zu in(4) wird, habe aber leider keine möglichkeiz in postgres
gefunden!

ein ALTER table io ALTER COLUMN wort RENAME TO wort int(4); oder ähnliches hat nicht gefunzt!

danke für hilfe!

  1. Hi,

    ich habe in einer postgres datenbank eine tabelle test mit dem feld wort, das den datentyp varchar hat.

    vielleicht hilft Dir das:

    ALTER TABLE - Modifies table properties
    ALTER TABLE table [ * ]
        ADD [ COLUMN ] column type
    ALTER TABLE table [ * ]
        ALTER [ COLUMN ] column { SET DEFAULT value | DROP DEFAULT }
    ALTER TABLE table [ * ]
        RENAME [ COLUMN ] column TO newcolumn
    ALTER TABLE table
        RENAME TO newtable
    ALTER TABLE table
        ADD table constraint definition

    table -> The name of an existing table to alter.
    column -> Name of a new or existing column.
    type -> Type of the new column.
    newcolumn -> New name for an existing column.
    newtable -> New name for the table.

    also in Deinem Falle:

    ALTER TABLE tabellenname ALTER COLUMN wort {SET DEFAULT int4};

    danke für hilfe!

    bitte
    hoh
    ROmy

    --
    DIE ROMY AUS L. AN DER P. SAGT DANKE UND AUF WIEDERSEHEN
    ->Alles ist gut wenn es aus Schokolade ist
    1. ALTER TABLE - Modifies table properties
      ALTER TABLE table [ * ]
          ADD [ COLUMN ] column type
      ALTER TABLE table [ * ]
          ALTER [ COLUMN ] column { SET DEFAULT value | DROP DEFAULT }
      ALTER TABLE table [ * ]
          RENAME [ COLUMN ] column TO newcolumn
      ALTER TABLE table
          RENAME TO newtable
      ALTER TABLE table
          ADD table constraint definition
      also in Deinem Falle:

      ALTER TABLE tabellenname ALTER COLUMN wort {SET DEFAULT int4};

      ne, das isses eben nicht! der default wert ist mir egal, ich möchte den datentyp ändern!

      folgendes ändert eben den spaltennamen, aber den datentyp kann ich eben so nicht ändern!
      alter table io rename wort to newwort;

      das muss doch gehen!!!!!!

      1. Hallo,

        ne, das isses eben nicht! der default wert ist mir egal, ich möchte den datentyp ändern!

        sorry, hab mich verlesen in dieser Doku, aber sie ist trotzdem Dein Weg.
        Soweit ich das überblicke, gibt es keinen Befehl der dies direkt tut, also geh einen Umweg über drop column und add column, da Du bei add die neue Value angeben kannst!

        hilft das jetzt?
        romy

        --
        DIE ROMY AUS L. AN DER P. SAGT DANKE UND AUF WIEDERSEHEN
        ->Alles ist gut wenn es aus Schokolade ist
        1. Hallo,

          Some features are not yet implemented though :

          dropping a column
           changing a column from NULL to NOT NULL or vice versa
           adding a primary key
           changing a column type
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

          romy

          --
          DIE ROMY AUS L. AN DER P. SAGT DANKE UND AUF WIEDERSEHEN
          ->Alles ist gut wenn es aus Schokolade ist
      2. Hallo,

        das muss doch gehen!!!!!!

        nicht unbedingt. Die wenigsten Datenbanken erlauben eine solche Operation (wegen möglicher Einwende: MS Access zählt für mich nicht als Datenbank), weil sie auch große Gefahren birgt. Nämlich das die Daten dadurch verfälscht werden (typisches beispiel int4 --> int2; bei großen Zahlen werden die überschüssigen Bits einfach abgeschnitten).
        Der übliche (und auch sicherere) Weg ist daher erst die Tabellendaten wegzuschreiben die Tabelle neu anzulegen und dann die Daten wieder zu importieren. Dann ist sichergestellt, dass gültige Daten vorliegen weil bei ungültigen gibt es eine Fehlermeldung.
        Im Falle von PostgreSQL wäre das ganze sogar noch einfacher. Das Programm pg_dump erlaubt ein DUMP von Tabellen und das wird dann alles im SQL-Klartext in einer angegebenen Datei abgelegt. Da brauchst Du dann nur noch das CREATE TABLE Statement zu manipulieren, die Tabelle in der Datenbank zu löschen und dann die Daten per psql wieder einzuspielen.

        Ich hoffe das hilft Dir weiter
        Gruss
           MichaelB

  2. Hi steffen

    So weit ich weis ist das nicht möglich bei PostgreSQL. Was aber
    möglich ist, ist eine Tabelle aus einer Query zu kreieren (mit
    allen Daten die drin sind.

    http://www.postgresql.org/idocs/index.php?sql-createtableas.html

    Das würde für dich bedeuten, kreiere die Tabelle aus der bisherigen
    Tabelle ohne die varchar Spalte. Dann fügst du an die neue Tabelle
    die Spalte an (das geht ja), löscht die alte Tabelle und nennst die
    neue Tabelle um.

    Falls Inhalte übernommen werden sollen aus der varchar-Spalte, wirst
    du in der as Query etwas tricksen müssen mit Konvertierungsfunktionen
    und Spaltenaliasen.

    Gruss Daniela