# ID-Rückgabe bei INSERT



## Camino (6. Apr 2010)

Hallo,

ich hab in meiner Swing-Anwendung ein Formular, welches Daten aus zwei oder mehreren Tabellen einer PostgreSQL-Datenbank zur Veränderung der Daten enthält bzw. zur Neueingabe von Datensätzen. Wenn ich nun einen neuen Datensatz in einer Tabelle anlege, dessen automatisch erzeugte ID aber in der anderen Tabelle als Fremdschlüssel eingetragen werden soll, weiss ich ja beim Anlegen des Datensatzes noch nicht die neue ID. Gibt es eine Möglichkeit, beim INSERT eines Datensatzes, direkt die neue ID zurückgeliefert zu bekommen? Kann mir jemand hier weiterhelfen, oder sollte ich das im PostgreSQL-Forum fragen?

Gruss
Camino


----------



## Jay_030 (6. Apr 2010)

Ja, das wird von JDBC unterstützt. Voraussetzung ist, dass dein JDBC Treiber das Feature implementiert.

Wichtig ist, wenn du dein Statement-Objekt erzeugst, musst du angeben, dass auto-generated Schlüssel zurückgegeben werden soll:

```
connection.prepareStatement("INSERT INTO ...", Statement.RETURN_GENERATED_KEYS);
```

Nachdem du den Insert-Befehl in der DB ausgeführt hast, kannst du dir mit der Methode getGeneratedKeys() des Statement-Objektes die Schlüssel holen.


----------



## Camino (6. Apr 2010)

Hallo und danke,

werde das mal ausprobieren. Das muss ich dann aber bestimmt sofort nach dem INSERT machen? Hmm, eigentlich auch logisch. Später hab ich das Statement-Objekt ja auch nicht mehr...

Gruss
Camino


----------



## Camino (7. Apr 2010)

OK, hab es jetzt hingekriegt:


```
...
Connection conn = getConnection();

String sql = "INSERT INTO institute VALUES(DEFAULT, ?,?)";

PreparedStatement prest;
		try {
			prest = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
			prest.setString(1, institut.getInstitutName());
		    prest.setString(2, institut.getInstitutKuerzel());
		    int count = prest.executeUpdate();
		    ResultSet rs = prest.getGeneratedKeys();
		    rs.next();
		    System.out.println("Zuletzt eingetragene ID: " + rs.getInt(1));
		    System.out.println(count + " row(s) affected");
		} catch (SQLException e) {
			e.printStackTrace();
		}

closeConnection(conn);
...
```

Die Methode getGeneratedKeys() liefert mir ja nicht nur die zuletzt eingetragene ID zurück, sondern ein ResultSet mit dem kompletten zuletzt eingetragenen Datensatz. Aber egal. So komme ich jedenfalls an die gewünschte ID und kann sie nun in die andere Tabelle als Fremdschlüssel eintragen.

Vielen Dank!

Gruss
Camino


----------



## moessi91 (31. Mrz 2011)

Habe das fast genauso gemacht aber wenn ich dann den Wert zurückbekommen soll bekomme ich folgende Exception:
SCHWERWIEGEND: org.postgresql.util.PSQLException: Die Rückgabe automatisch generierter Schlüssel wird nicht unterstützt,
Hier kurz das PreparedStatement das die Exception wirft:

```
PreparedStatement ps = verbindung.prepareStatement(
                                "INSERT INTO artists (vorname, nachname, adresse, email, homepage, biographie, "
                                + "telefonnummer, plz, hausnummer, pic) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
                                Statement.RETURN_GENERATED_KEYS);
```

So mein JDBC anbindung:
postgresql-9.0-801.jdbc4

Mein postgre datenbank:
pgAdmin: 1.12.2
PSQL 9


----------



## Gast2 (31. Mrz 2011)

Die Exception sagt schon alles... Postgres unterstützt das nicht 

Ich glaube bei Postgres kommt immer die OID der neuen Zeile zurück.


----------

