PostgreSQL Datenbankpraxis für Anwender, Administratoren und Entwickler

Kapitel 13 - Umsteigen von MySQL

Seite 416

AUTO_INCREMENT ersetzen

CREATE TABLE benutzer (
  id            SERIAL        PRIMARY KEY,
  benutzername  VARCHAR,
  ...
);


Unsigned Integer

CREATE TABLE check_demo1 (
  id     INTEGER   NOT NULL
                   CHECK (id >= 0)

);


Spalten überprüfen

CREATE TABLE check_demo2 (
  spalte1       VARCHAR,
  spalte2       VARCHAR,
  CHECK (spalte1 IS NOT NULL OR spalte2 IS NOT NULL)
);

Seite 417

Funktionen zur Prüfung einsetzen

CREATE TABLE check_demo3 (
  ...
  passwort     CHAR(32)     NOT NULL
                            CHECK (LENGTH(passwort) = 32)
 ...
);


Vorgabewerte setzen

CREATE TABLE default_demo1 (
  ...
  webseite_anzeigen   BOOLEAN    NOT NULL
                                 DEFAULT FALSE,
 ...
);

Seite 418

ZEROFILL ersetzen

SELECT lpad(354::text, 6, '0');


GROUP BY-Beispiel

CREATE TABLE groupby_test (
  id       INTEGER          PRIMARY KEY,
  daten    VARCHAR(10)      NOT NULL
);

INSERT INTO groupby_test (id, daten) VALUES (1, 'a');
INSERT INTO groupby_test (id, daten) VALUES (2, 'b');
INSERT INTO groupby_test (id, daten) VALUES (3, 'c');
INSERT INTO groupby_test (id, daten) VALUES (4, 'a');
INSERT INTO groupby_test (id, daten) VALUES (5, 'b');


GROUP BY-Beispiel

mysql> SELECT id, daten FROM groupby_test GROUP BY daten;


Aggregatfunktion nutzen

SELECT id, daten FROM groupby_test GROUP BY daten;
SELECT id, daten FROM groupby_test GROUP BY daten, id;
SELECT MAX(id), daten FROM groupby_test GROUP BY daten;

Seite 419

Unterschiedliche Sortierreihenfolgen

CREATE TABLE null_test (
  id       INTEGER          PRIMARY KEY,
  daten    VARCHAR(10)
);

INSERT INTO null_test (id, daten) VALUES (1, 'a');
INSERT INTO null_test (id, daten) VALUES (2, NULL);
INSERT INTO null_test (id, daten) VALUES (3, 'b');
INSERT INTO null_test (id, daten) VALUES (4, NULL);
INSERT INTO null_test (id, daten) VALUES (5, 'c');


MySQL: Unterschiedliche Sortierreihenfolgen

mysql> SELECT id, daten FROM null_test ORDER BY daten;

PostgreSQL: Unterschiedliche Sortierreihenfolgen

SELECT id, daten FROM null_test ORDER BY daten;

Seite 420

Sortierreihenfolge in PostgreSQL

SELECT id, daten FROM null_test ORDER BY daten NULLS FIRST;


IFNULL() und COALESCE()

mysql> SELECT IFNULL(NULL, 10);
mysql> SELECT COALESCE(NULL, 10, 20);

Unterschiedliche Bezeichner

SELECT 1 AS GROSS;
SELECT 1 AS GeMiScHt;


Originalen Bezeichner erhalten

SELECT 1 AS "GeMiScHt";

Seite 423

LIKE und ILIKE

SELECT 'ABC' LIKE 'abc';
SELECT 'ABC' ILIKE 'abc';

Seite 424

INSERT IGNORE emulieren

CREATE TABLE merge_test
       (id INT PRIMARY KEY, inhalt TEXT);
CREATE FUNCTION merge_tabelle(schluessel INT, daten TEXT)
      RETURNS VOID AS
$$
BEGIN
    LOOP
        -- zuerst wird ein Update versucht
        UPDATE merge_test SET inhalt = daten WHERE id = schluessel;
        IF found THEN
            -- Update erfolgreich
            RETURN;
        END IF;

        -- nichts gefunden, Daten mittels INSERT einfügen
        BEGIN
            INSERT INTO merge_test
                        (id, inhalt)
                 VALUES (schluessel, daten);
            -- Einfügen erfolgreich
            RETURN;
        EXCEPTION WHEN unique_violation THEN
            -- Fehler, erneut versuchen
        END;
    END LOOP;
END;
$$
LANGUAGE plpgsql;
SELECT merge_tabelle(23, 'wichtige Daten');

Seite 428

Datenbank konvertieren

perl mysql2pgsql.perl mysql-dump.sql pg-dump.sql