Nach diesem ersten Überblick über CREATE TABLE wollen wir uns dem Einfügen von Datensätzen zuwenden. Zu diesem Zwecke bietet SQL das Kommando INSERT:
test=# \h INSERT
Command: INSERT
Description: create new rows in a table
Syntax:
INSERT INTO table [ ( column [, ...] ) ]
{ DEFAULT VALUES | VALUES ( { expression | DEFAULT } [, ...] ) [, ...] | query }
[ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ]
Zuallererst müssen wir definieren, in welche Tabelle wir einfügen wollen. Die Liste der Spalten ist dabei optional. In weiterer Folge müssen wir die Werte angeben:
test=# INSERT INTO t_person (svnr, name)
VALUES ('123456789', 'Peter Fischer');
INSERT 318715 1
test=# SELECT * FROM t_person;
svnr | name
-----------+---------------
123456789 | Peter Fischer
(1 row)
In diesem Beispiel befüllen wir alle Spalten mit Werten. Anschließend fragen wir das Ergebnis mit einem sogenannten SELECT-Statement ab - doch dazu später mehr. Oft kommt es vor, dass manche Spalten in der Tabelle nicht bekannt sind und daher nicht befüllt werden sollten. In solchen Fällen kann man wie folgt vorgehen:
test=# INSERT INTO t_person (svnr) VALUES ('9876543');
INSERT 318716 1
Wie Sie in der Syntaxübersicht vielleicht gesehen haben, ist die Spaltenliste optional. Es ist durchaus auch möglich, die Spaltenbezeichnungen wegzulassen:
test=# INSERT INTO t_person VALUES ('123123123', 'Anton Hudlic');
INSERT 318717 1
In solchen Fällen befüllt PostgreSQL die Spalten der Reihe nach. Das sieht zwar auf den ersten Blick sehr bequem aus - birgt aber durchaus langfristige Risiken. Ändert sich die Datenstruktur indem Sie beispielsweise eine Spalte am Anfang der Tabelle löschen und dafür eine andere Spalte anhängen, kann es durchaus vorkommen, dass Ihr SQL-Statement nach wie vor funktioniert - die Spalten allerdings falsch (also versetzt) befüllt werden. Das kann fatale Folgen haben. Im schlimmsten Fall erkennen Sie den Fehler nicht sofort und erzeugen auf diese Art Datenmüll. Verwenden Sie daher wenn möglich immer explizite Spaltennamen, um sicherzustellen, dass veränderte Datenstrukturen zu keinem Problem führen können.
Oft möchte man sehen, welche Werte man soeben in eine Tabelle eingefügt hat. Das ist vor allem dann sinnvoll, wenn man nicht alle Werte in einem Datensatz explizit angegeben hat. Genau für solche Zwecke unterstützt PostgreSQL in neueren Versionen eine RETURNING-Clause:
test=# INSERT INTO t_person VALUES ('323223', 'Josef Ackermann') RETURNING *;
svnr | name
--------+-----------------
323223 | Josef Ackermann
(1 row)
INSERT 0 1
Mit Hilfe von RETURNING kann man angeben, welche Spalten man gerne retourniert bekommen möchte. In unserem Beispiel haben wir '*' angegeben und PostgreSQL hat uns daher alle sich in der Tabelle befindlichen Spalten zurückgegeben.
In manchen Fällen kann es vorkommen, dass Sie Testdaten generieren müssen. Auch für solche Zwecke stellt INSERT Lösungen bereit. Sehen wir uns eine einfache Tabelle an:
test=# CREATE TABLE t_testdata (id int4); CREATE TABLE test=# INSERT INTO t_testdata (id) VALUES (1); INSERT 318721 1
Wollen wir die Daten in dieser Tabelle verdoppelt, können Sie wie folgt operieren:
test=# INSERT INTO t_testdata (id) SELECT id FROM t_testdata; INSERT 318722 1 test=# SELECT * FROM t_testdata; id ---- 1 1 (2 rows)
Das INSERT-Statement wird mit Daten aus einem SELECT-Statement gefüttert und verdoppelt auf diese Weise den Datenbestand. So können Sie mit wenigen SQL-Statements in kurzer Zeit eine große Menge Testdaten erzeugen.
Um die Performance einer Applikation hoch zu halten, sollten Sie es wenn möglich vermeiden, zahlreiche einzelne INSERT Statements gegen die Datenbank zu fahren. Wenn Sie Daten importieren wollen, sollten Sie COPY verwenden aber dazu später noch mehr.