PostgreSQL for MySQL Users
Aus Geoinformation HSR
Version vom 29. August 2017, 13:29 Uhr von Das-g (Diskussion | Beiträge) (→MySQL's AUTO INCREMENT: mark up SQL keywords & SQL code in prose)
Siehe auch:
Licensing:
- MySQL: Dual Licensed
- PostgreSQL: BSD-Style
Inhaltsverzeichnis
Internet Resources
- https://wiki.postgresql.org/wiki/Things_to_find_out_about_when_moving_from_MySQL_to_PostgreSQL
- https://opslife.org/postgresql-for-mysql-administrators/
- http://www.coderholic.com/postgresql-for-mysql-users/
- http://stackoverflow.com/questions/772111/switching-from-mysql-to-postgresql-tips-tricks-and-gotchas
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
oderSEQUENCE
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', ...);
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 |