CodeGym /Kurse /SQL SELF /Änderung von Datentypen bei Spalten

Änderung von Datentypen bei Spalten

SQL SELF
Level 18 , Lektion 1
Verfügbar

Stell dir vor, du erstellst mal wieder eine Tabelle für Studenten an einer Uni. Schon wieder! :)

Am Anfang entscheidest du, dass das Feld für das Alter age ein Integer sein soll und gibst den Typ SMALLINT an (passt für Zahlen von -32.768 bis 32.767). Aber irgendwann wächst die Datenbank und du fügst Infos über Studenten aus anderen Ländern hinzu, die ihr Alter... in Tagen seit der Geburt angeben! Da wird SMALLINT plötzlich zu klein – Zeit, z.B. auf INTEGER umzusteigen.

Hier sind noch ein paar typische Fälle, wann man den Datentyp ändern muss:

  1. Erhöhung oder Verringerung des Zahlenbereichs.
  2. Ändern der String-Länge (z.B. von VARCHAR(50) auf VARCHAR(100)).
  3. Wechsel zu einem anderen Datentyp zur Optimierung (z.B. TEXT in VARCHAR umwandeln).
  4. Fehler bei der ursprünglichen Wahl des Spaltentyps (z.B. hast du BOOLEAN statt INTEGER angegeben).

Syntax für das Ändern des Datentyps

In PostgreSQL änderst du den Datentyp einer Spalte mit dem Befehl ALTER TABLE. Damit passt du die Tabellenstruktur an neue Anforderungen an.

ALTER TABLE table_name
ALTER COLUMN column_name TYPE new_data_type;

Easy: Du gibst den Tabellennamen an, die Spalte, die du ändern willst, und den neuen Datentyp.

Beispiel 1: Wechsel von INTEGER zu BIGINT

Angenommen, wir haben eine Tabelle für Studenten:

CREATE TABLE students (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    age INTEGER
);

Alles war cool, solange das Alter nicht in Millionen Jahren angegeben wurde (frag nicht, ist nur ein Beispiel!). Um PostgreSQL zu beruhigen, ändern wir den Typ der Spalte age von INTEGER auf BIGINT:

ALTER TABLE students
ALTER COLUMN age TYPE BIGINT;

Beispiel 2: String-Länge erhöhen

Du hast eine Tabelle für Kurse erstellt und angenommen, dass die Namen maximal 50 Zeichen lang sind:

CREATE TABLE courses (
    id SERIAL PRIMARY KEY,
    name VARCHAR(50)
);

Aber plötzlich merkst du, dass die Kursnamen viel komplexer und länger sind als gedacht. Kein Problem:

ALTER TABLE courses
ALTER COLUMN name TYPE VARCHAR(150);

Beispiel 3: Typen konvertieren

Sagen wir, wir hatten eine Tabelle, in der das Feld birth_date als Text gespeichert wurde:

CREATE TABLE employees (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100),
    birth_date TEXT
);

Du merkst, dass es unpraktisch ist, mit Daten im TEXT-Format zu arbeiten, weil du keine Filter oder Sortierung machen kannst. Lösung? Wir wandeln TEXT in DATE um:

ALTER TABLE employees
ALTER COLUMN birth_date TYPE DATE USING birth_date::DATE;

Achte auf den Teil USING birth_date::DATE. Damit sagst du PostgreSQL, dass die Daten vor dem Typwechsel konvertiert werden sollen.

Warum ist manchmal eine explizite Datenkonvertierung nötig?

Wenn PostgreSQL einen Typwechsel macht, versucht es automatisch, die vorhandenen Daten in den neuen Typ zu konvertieren. Wenn das nicht klappt, gibt’s einen Fehler. Zum Beispiel: Wenn du ein Feld von TEXT auf INTEGER änderst, ohne zu sagen, wie der Text interpretiert werden soll, geht das schief.

Beispiel für ein Problem

ALTER TABLE employees
ALTER COLUMN birth_date TYPE DATE;
-- Fehler: Wert 'not a date' kann nicht in Typ DATE konvertiert werden.

Für dieses Problem gibt’s eine Lösung. Füge eine explizite Konvertierung mit USING hinzu:

ALTER TABLE employees
ALTER COLUMN birth_date TYPE DATE USING to_date(birth_date, 'YYYY-MM-DD');

Hier nutzen wir die Funktion to_date(), um Strings ins Datumsformat zu bringen.

Das USING-Kommando

In PostgreSQL, wenn du den Typ einer Spalte mit ALTER TABLE ... ALTER COLUMN ... TYPE änderst, musst du manchmal angeben, wie die vorhandenen Daten konvertiert werden sollen – und dafür gibt’s das Schlüsselwort USING.

Syntax:

ALTER TABLE table_name
ALTER COLUMN column_name TYPE new_data_type
USING expression;

Erklärung:

  • USING erlaubt dir, eine Formel für die Konvertierung der Werte vom alten in den neuen Typ anzugeben.
  • Das ist besonders praktisch, wenn automatische Konvertierung nicht möglich oder unklar ist.

Einfaches Beispiel: String → Zahl

ALTER TABLE users
ALTER COLUMN age TYPE INTEGER
USING age::INTEGER;

Hier war age ursprünglich vom Typ TEXT, und wir wollen ihn in INTEGER umwandeln. USING age::INTEGER ist die explizite Typkonvertierung.

Beispiel: Text → Datum

ALTER TABLE events
ALTER COLUMN event_date TYPE DATE
USING TO_DATE(event_date, 'YYYY-MM-DD');

Wenn event_date ein Text wie '2023-10-25' war, sagen wir PostgreSQL, wie er das in den Typ DATE umwandeln soll.

Wann ist USING Pflicht?

  • Wenn kein direktes Casting möglich ist.
  • Wenn die Daten transformiert werden müssen.
  • Wenn die Typen inkompatibel sind (TEXTBOOLEAN, VARCHARINTEGER usw.).

Typische Fehler beim Ändern von Datentypen

Fehler bei fehlender Datenkonvertierung. Wenn die Daten nicht automatisch in den neuen Typ passen, musst du unbedingt eine Konvertierung mit USING angeben.

ALTER TABLE employees
ALTER COLUMN birth_date TYPE DATE;
-- Fehler: Spalte 'birth_date' enthält ungültige Werte für Typ DATE

Operation sperrt die Tabelle. Beachte, dass das Ändern des Datentyps die Tabelle für Schreibzugriffe sperren kann, bis die Operation fertig ist. Das ist besonders bei großen Tabellen wichtig. Plane Änderungen am besten in Zeiten mit wenig Aktivität.

Probleme mit verknüpften Tabellen und Foreign Keys. Wenn die Spalte Teil eines Foreign Keys ist, kann die Änderung schwieriger werden. PostgreSQL verlangt dann, dass du die Foreign Keys neu anlegst.

Nützliche Tipps

Check immer die aktuellen Daten. Nutze Abfragen wie SELECT DISTINCT column_name vor der Typänderung, um zu sehen, ob die Daten problemlos konvertiert werden können.

Teste deine Änderungen. Erstelle eine temporäre Kopie der Tabelle und probiere alles dort aus, bevor du die Haupttabelle änderst. Zum Beispiel:

CREATE TEMP TABLE temp_students AS SELECT * FROM students;

Vergiss USING nicht. Das ist dein Retter, wenn sich der Datentyp radikal ändert (z.B. TEXTNUMERIC).

Jetzt weißt du, wie man den Datentyp einer Spalte in PostgreSQL ändert. Ich hoffe, beim nächsten Mal, wenn du die Datenstruktur überdenken musst, bist du sicher unterwegs. Tabellen sind zwar schlau, aber auch sie brauchen manchmal ein Upgrade!

Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION