Re: Datensatz an vorbestimmter Stelle einfuegen.

From: "Gunnar \"Nick\" Bluth" <gunnar(dot)bluth(at)pro-open(dot)de>
To: Nicolas Barbier <nicolas(dot)barbier(at)gmail(dot)com>, Guenther Boelter <gboelter(at)gmail(dot)com>
Cc: PostgreSQL <pgsql-de-allgemein(at)postgresql(dot)org>
Subject: Re: Datensatz an vorbestimmter Stelle einfuegen.
Date: 2014-02-03 18:59:22
Message-ID: 52EFE70A.6090408@pro-open.de
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-de-allgemein

Am 03.02.2014 15:48, schrieb Nicolas Barbier:
> Am 3. Februar 2014 15:03 schrieb Guenther Boelter <gboelter(at)gmail(dot)com>:
>
>> Gibt es unter PostgreSQL die Moeglichkeit einen Datensatz an einer
>> bestimmten Stelle in die Datenbank (Tabelle) einzufuegen, also z. B. als
>> 10. Datensatz wobei evtl. vorhandene Datensaetze dann entsprechend um 1
>> nach hinten verschoben werden?
>>
>> Sinn und Zweck ist es, die Daten dann spaeter ohne weiteren Aufwand in
>> eben genau in der Reihenfolge auch wieder auszugeben. Es geht hier bei
>> der Ausgabe immer nur um wenige Datensaetze.
> SQL-Datenbanken haben kein impliziertes Konzept der Reihenfolge der
> Zeilen einer Tabelle. Wenn man die Zeilen in einer bestimmen
> Reihenfolge zurückbekommen will, soll man das immer mit einer ORDER
> BY-Klausel erzwingen. Diese ORDER BY-Klausel kann z. B. eine
> „Index“-Spalte benutzen, die die Reihenfolge bestimmt.
>
> Eine Zeile in der Mitte einfügen, macht man dann z. B. indem man die
> „späteren“ Zeile verschiebt (also die Index-Werte eins erhöht) und die
> neue Zeile „dazwischensteckt“ (also mit dem richtigen Index-Wert, der
> nach der Verschiebung nicht mehr benutzt wird).
Generell ist es so (auch dokumentiert), dass die Zeilen in der
Reihenfolge kommen in der sie in der Page / den Pages liegen. Das ist
letztlich bei allen DBMS so (dafür gibt es ja ORDER BY ;-).

Die einfache Lösung ist wie beschrieben eine "ID"-Spalte; nicht schwer
zu implementieren, aber du kannst mit der concurrency Probleme bekommen.

Mir kam eben noch der Gedanke, ob man mit rekursiven CTEs eine "linked
list" implementieren könnte (wobei das erste Element dasjenige sein
müsste, das keinen Folge-/Vorgängerverweis hat), also sowas wie:

CREATE TABLE meine_liste (feld varchar not null, vorgaenger varchar);

Das bringt aber wieder ganz eigene Probleme mit sich:
- constraint auf "vorgaenger": muss NULL oder "in (select feld from
meine_liste)" sein
- die CTE versteht niemand ;-)
- feld muss UNIQUE sein
- Updates sind zwar potentiell konfliktfrei (Einfügen in eine linked
list ist ja gut erforscht ;), aber eben nicht 100%ig

Ich hab versucht, das CTE zu schreiben, und verweise daher auf
http://practiceovertheory.com/blog/2013/07/12/recursive-query-is-recursive/

Alles in allem würde ich ganz stiekum sagen: mach's über ein ID-Feld mit
"ORDER BY ID ASC". Achtung: UNIQUE INDEX mit "|DEFERRABLE INITIALLY
DEFERRED" anlegen!

Aber spannendes Thema ;-)

Gruß aus Oberursel,
|

--
Gunnar "Nick" Bluth
RHCE/SCLA

Mobil +49 172 8853339
Email: gunnar(dot)bluth(at)pro-open(dot)de
__________________________________________________________________________
In 1984 mainstream users were choosing VMS over UNIX. Ten years later
they are choosing Windows over UNIX. What part of that message aren't you
getting? - Tom Payne

In response to

Browse pgsql-de-allgemein by date

  From Date Subject
Next Message Markus Winand 2014-02-04 07:59:29 Re: Datensatz an vorbestimmter Stelle einfuegen.
Previous Message Nicolas Barbier 2014-02-03 14:48:19 Re: Datensatz an vorbestimmter Stelle einfuegen.