PostgreSQL for MySQL Users: Unterschied zwischen den Versionen

Aus Geoinformation HSR
Wechseln zu: Navigation, Suche
K (MySQL's INSERT UPDATE: SQL-Keywords MIT GROSSBUCHSTABEN)
(MySQL's AUTO INCREMENT: serial ODER sequence, nicht beides)
Zeile 36: Zeile 36:
 
* Oracle: SEQUENCE
 
* Oracle: SEQUENCE
 
* MySQL: id INT UNSIGNED NOT NULL AUTO_INCREMENT
 
* MySQL: id INT UNSIGNED NOT NULL AUTO_INCREMENT
* PostgreSQL: id SERIAL und SEQUENCE
+
* PostgreSQL: id SERIAL oder SEQUENCE
  
  A. SERIAL Gebrauch:
+
=== Syntactic sugar: SERIAL ===
    CREATE TABLE (
+
Gebrauch:
      Identifier SERIAL;
+
CREATE TABLE (
      -- ...
+
  Identifier SERIAL;
    );
+
  -- ...
 
+
);
  B. SEQUENCE:
+
 
  Definition: CREATE SEQUENCE myseq;
+
===  Explizite Variante: SEQUENCE ===
  Gebrauch:
+
Definition:
    CREATE TABLE (
+
CREATE SEQUENCE myseq;
      Identifier NUMBER DEFAULT nextval('myseq');
+
Gebrauch:
      -- ...
+
'''entweder''' als Standard-Wert der Spalte:
    );
+
CREATE TABLE (
  oder:
+
  Identifier NUMBER DEFAULT nextval('myseq');
    INSERT ... INTO VALUES(nextval('myseq'), 'Name', ...);
+
  -- ...
 +
);
 +
'''oder''' explizit beim Einfügen neuer Zeilen:
 +
INSERT ... INTO VALUES(nextval('myseq'), 'Name', ...);
  
 
* Siehe auch [http://www.postgresql.org/docs/8.0/static/datatype.html#DATATYPE-SERIAL 1] und [http://www.frankhilliard.com/serialstory.cfm 2]
 
* Siehe auch [http://www.postgresql.org/docs/8.0/static/datatype.html#DATATYPE-SERIAL 1] und [http://www.frankhilliard.com/serialstory.cfm 2]

Version vom 29. August 2017, 13:25 Uhr

Siehe auch:

Licensing:

  • MySQL: Dual Licensed
  • PostgreSQL: BSD-Style

Internet Resources


MySQL's INSERT UPDATE

Option 1) Write a function like:

 CREATE FUNCTION doinsert(_id integer, _value text) RETURNS void AS $$
 BEGIN
  UPDATE thetable SET value = _value WHERE id = _id;
  IF NOT FOUND THEN
     INSERT INTO thetable(id, value) VALUES (_id, _value);
   END IF
 END;
 $$ LANGUAGE plpgsql;

Option 2) Use two SQL statements:

 -- update the existing
 UPDATE realTable SET VALUE = (SELECT VALUE FROM tmp WHERE tmp.id = realTable.id)
 WHERE EXISTS (SELECT VALUE FROM tmp WHERE tmp.id = realTable.id);
 -- insert the missing
 INSERT INTO realTable(id, value)
 SELECT id, value FROM tmp WHERE NOT EXISTS(SELECT 1 FROM realTable WHERE tmp.id = realTable.id);

MySQL's AUTO INCREMENT

  • Oracle: SEQUENCE
  • MySQL: id INT UNSIGNED NOT NULL AUTO_INCREMENT
  • PostgreSQL: id SERIAL oder SEQUENCE

Syntactic sugar: SERIAL

Gebrauch:

CREATE TABLE (
  Identifier SERIAL;
  -- ...
);

Explizite Variante: SEQUENCE

Definition:

CREATE SEQUENCE myseq;

Gebrauch: entweder als Standard-Wert der Spalte:

CREATE TABLE (
  Identifier NUMBER DEFAULT nextval('myseq');
  -- ...
);

oder explizit beim Einfügen neuer Zeilen:

INSERT ... INTO VALUES(nextval('myseq'), 'Name', ...);
  • Siehe auch 1 und 2

MySQL's DROP TABLE IF EXIST

  • Existiert auch in PostgreSQL ab Version 8.2
  • Bei früheren Versionen gibt es einen Workaround:
    •  % select count(*) from pg_class where relname = 'mytable'
    • return 1 if mytable exists, and 0 if it doesn't
    • so you can run a DROP TABLE command (or not) based on the returned value.

MySQL's INT UNSIGNED (Cardinal)

  • MySQL: column INT UNSIGNED
  • PostgreSQL: column INT CHECK (column > 0)

MySQL's Index-Typ

  • MySQL: INDEX idx_id(id)
  • PostgreSQL: CREATE INDEX idx_id ON TABLENAME(id);

MySQL's Query Resultset Limit

  • MySQL: SELECT * FROM tbl LIMIT 10, 5
  • PostgreSQL: SELECT * FROM tbl LIMIT 5 OFFSET 10

Data types of MySQL versus PostgreSQL

Mysql PostgreSQL
Typ Beschreibung Typ Beschreibung
tinyint -128..127 - -
smallint -32768..+32767 int2 -32767 ... +32768
int -2147483648.. +2147483647 int4 -2147483648 ... +2147483647
int8 +/- 18 Dezimalstellen
float(n) n E {4;8}, Einf./doppelte Genauig. float4 6 Dez.Stellen
float8 15 Dezimalstellen
date YYYY-MM-DD Datumsformat date Datum, Datumformate mit SET DATESTYLE=Value einstellbar
time HH-MM-SS Zeitformat time Uhrzeit, Auflösung 1 Mikrosekunde
char(m) Zeichenkette mit fester Länge char ein Zeichen
varchar(m) variable Länge, max. m Zeichen varchar(n) 4+n Bytes
blob Binary Large Object, wird für Texte gebraucht, "TINY", "", "LONG" bytea
money 4 Byte, -21474836,48 ... +21474836,47
text Variable Länge
bool Kann den Wert 't' oder 'f' annehmen