Zuletzt erzeugten ID/Eintrag, etc. anzeigen lassen

hallo!
habe eine Tabelle mit folgender Struktur:

id | name

1 | Paul
2 | Paul
3 | Horst

gibt es mit dem SELECT-Befehl die Möglichkeit NUR den zuletzt angelegten Eintrag “Paul” abzufragen (also den mit ID=2).
SELECT * FROM tabellenname WHERE name=Paul AND id=2;
funktioniert natürlich. Jedoch möchte ich diesen “Umweg” über die id Spalte vermeiden.

Woher weisst du (und woher soll die Datenbank wissen), das ID=2 der letzte Eintrag ist?

Wenn du nur einer Nummer nach sortieren willst, nutze einen Serial Datentyp. Ansonsten bau einen Timestamp in deine Tabelle ein und setze den Wert beim Einfügen automatisch. Genügend Beispiele, wie man das mit einem Trigger löst, gibt es im Netz.

Ein TRIGGER wäre in dem Fall aber irknwie zuviel Aufwand…

Andreas

ich glaube ich hätte mein Problem etwas ausführlicher schildern sollen:
Ich habe wie gesagt eine Tabelle mit den Namen:

id | name | …

1 | Paul | …
2 | Paul | …
3 | Horst | …
4 | Paul | …

die id wurde hierbei automatisch erzeugt.das ganze soll nun in zwei Tabellen aufgeteilt werden, eine Tabelle mit den ids mit Paul, eine Tabelle mit den ids von Horst.

id | Paul_id

1 | 1
2 | 2
3 | 4

und

id | Horst_id

1 | 3


die jeweils erste Spalte (id) wird wieder automatisch per serial erzeugt.
Versuche ich es mit dem Befehl:
INSERT INTO tabellenname (Paul_id) VALUES ((SELECT id FROM tabellenname WHERE name = ‘Paul’))
bekomme ich die meldung: more then one row returned by a subquery used as an expression … was auch logisch ist.
Gibt es einen anderen Weg ?

Ja, den richtigen. Klar, oder?

test=# create table foo (id serial, id2 int);
NOTICE:  CREATE TABLE will create implicit sequence "foo_id_seq" for serial column "foo.id"
CREATE TABLE
Zeit: 312,894 ms
test=*# insert into foo(id2) values(1);
INSERT 0 1
Zeit: 0,508 ms
test=*# insert into foo(id2) values(1);
INSERT 0 1
Zeit: 0,232 ms
test=*# insert into foo(id2) values(1);
INSERT 0 1
Zeit: 0,237 ms
test=*# insert into foo(id2) values(2);
INSERT 0 1
Zeit: 0,242 ms
test=*# insert into foo(id2) values(1);
INSERT 0 1
Zeit: 0,229 ms
test=*# create table foo2(id serial, foo_id int);
NOTICE:  CREATE TABLE will create implicit sequence "foo2_id_seq" for serial column "foo2.id"
CREATE TABLE
Zeit: 20,922 ms
test=*# insert into foo2(foo_id) select id from foo where id2=1;
INSERT 0 4
Zeit: 70,616 ms
test=*# select * from foo;
 id | id2
----+-----
  1 |   1
  2 |   1
  3 |   1
  4 |   2
  5 |   1
(5 Zeilen)

Zeit: 0,380 ms
test=*# select * from foo2;
 id | foo_id
----+--------
  1 |      1
  2 |      2
  3 |      3
  4 |      5
(4 Zeilen)

Zeit: 0,345 ms
test=*#

Du warst recht nah dran…

Andreas

Du warst recht nah dran…

Andreas

…YES ! :sunglasses:
Vielen Dank, funktioniert wunderbar