Me: Sqlite Zeile Ansprechen

Hi,

ich schreibe gerade an einer Art PHPMYADMIN für SQLite (mit definitv weniger funktionen^^). Das Programm ist derzeit soweit, dass es bis jetzt jede von mir getestete SQLite-db wie folgt ausgibt:

  • Zeigt mir die vorhandenen Tabellen an
  • Zeigt mir die Spalten in der ausgewählten Tabelle an
  • Zeigt mir die Einträge der ausgwählten Tabelle an

Jetzt gibt es das Problem: Wie lösche ich einen Eintrag?

Das ganze Programm ist natürlich so Allgemein wie möglich gehalten, d.h. ich kann jetzt nicht nach dem Schema gehen: Suche nach ID-Eintrag X und lösche/editiere Zeile mit ID eintrag = X.

Meine Datenbanken enthalten zwar IMMER eine ID, dennoch würde ich es gerne so handhaben, dass ich nicht vorrausetzen muss, dass eine ID vorhanden sein muss, da ich das Programm auch dazu nutzen will, andere SQLite-Tabellen zu Analysieren. Und vllt benutze der Ersteller der Tabellen nicht ID-Einträge.

Hoffe ich konnte mein Problem klar machen und hoffe auch (wie ich es von dem Forum gewohnt bin ;-) ) auf schnelle & konstruktive Antwort.

  1. Hi,

    ich schreibe gerade an einer Art PHPMYADMIN für SQLite (mit definitv weniger funktionen^^).

    warum das Rad neu erfinden?
    http://www.hotscripts.com/Detailed/33986.html

    Nur eine einzige Datei, klasse Hilfsmittel.
    Versteh immer noch nicht warum das so wenig bekannt ist.Leider.

    Ich hatte selbst mal die gleiche Idee wie du und fand dann aber durch sehr mühsames Suchen und vielen schlechten Tools das hier. Hier konnte ich sehr effektiv draus lernen und entsprechend meinen Bedürfnissen anpassen.

    Pete

  2. Hallo,

    ich schreibe gerade an einer Art PHPMYADMIN für SQLite

    Bevor Du das Rad neu erfindest: schau Dir mal SQLiteManager an.

    Alex

  3. ähm, mir ist klar das es soetwas gibt. Habe es jetzt (noch) nicht heruntergeladen. Zudem hatte ich schon 2 Sqlite-administrier-programme, die beide Script-fehler enthielten (fatale! sie waren nicht ausführbar).

    Und dann beantwortet das immernoch nicht meine Frage =( . Auch wenn es dafür schon etwas gibt, will ich mein Projekt dennoch fertig stellen

    1. ähm, mir ist klar das es soetwas gibt. Habe es jetzt (noch) nicht heruntergeladen. Zudem hatte ich schon 2 Sqlite-administrier-programme, die beide Script-fehler enthielten (fatale! sie waren nicht ausführbar).

      Und dann beantwortet das immernoch nicht meine Frage =( . Auch wenn es dafür schon etwas gibt, will ich mein Projekt dennoch fertig stellen

      Nochmals Hi,

      du hast meine Intention nicht richtig verstanden.
      Du hast schon 2 programme getestet und dich geärgert weil die nicht richtig funktionieren. Ging mir genau so und wollte es dann partout selbst machen.

      Dem steht aber auch nichts im Wege, ich habe dich nur auf das programm hingewiesen, weil du sehr schnell daraus lernen kannst um deines anzufertigen oder entsprechend das heruntergeladene anzupassen.

      Deine letzte Frage https://forum.selfhtml.org/?t=177605&m=1170153 hatte ich auch und gelöst hatte ich seher schnell mit dem Code  des Programms. Also sehr lehrreich. So findest in diesem Code Beispiel für fast alle Fragen die du hier noch stellen würdest.

      Nun zu deiner eigentlichen Frage. Wie soll man die denn beantworten wenn die Frage nicht mal richtig klar ist, ein konkretes Beispiel wäre nicht schlecht. Du willst allso Einträge löschen ohne vorhandene ID? Ja getreu SQL-Syntax sqlite>DELETE FROM music WHERE Title LIKE 'Heino%';

      Oder verstehe ich deine Frage falsch?

      Pete

      1. Nun zu deiner eigentlichen Frage. Wie soll man die denn beantworten wenn die Frage nicht mal richtig klar ist

        Ok, also ich wills nochmal neu versuchen zu erklären.

        stell dir vor ich schau mir eine Fremde SQLite-DB an und die hat z.B. folgende Felder:
        NAME
        INHALT
        DATUM

        dann steht in der Übersicht z.B.

        NAME | INHALT    | DATUM             (<-- Also das hier sind die Felder)
        -----|-----------|-------
        karl |Hallo du da| Heute             (<-- Und das die Einträge)
        -----|-----------|------
        heinz|Moin       | Heute             (<-- Und das auch die Einträge)

        So.

        jetzt will ich z.B. die erste Zeile löschen. Klar: jetzt könnte ich beim SQLite-Syntax:
        DELETE * FROM XYZ WHERE NAME='karl';
        schreiben, oder ich schreiben
        DELETE * FROM XYZ WHERE DATUM='Heute';

        klar. 2teres ist unlogisch wenn man folgendes nicht beachtet: Ich weis bei meiner Allgemeinen folge NICHT was später in den Feldern steht. Das heist mein Algorythmus könnte eventuell genau das Feld DATUM auswählen. Und genau dann hab ich ein Problem, denn er löscht mir ja dann alle Felder mit DATUM=HEUTE.
        Also muss ich irgendwie die Zeile anders auswählen. Und ich dachte, man kann ja mittels sqlite_seek() zu einer Zeile springen...also müsste man diese doch auch iwie bestimmen können?!

    2. Hallo,

      Und dann beantwortet das immernoch nicht meine Frage =( . Auch wenn es dafür schon etwas gibt, will ich mein Projekt dennoch fertig stellen

      Schau doch mal, wie phpMyAdmin das macht: wenn eine Spalte mit Primärschlüssel vorhanden ist, nimmt es diese zur Identifikation (DELETE FROM ... WHERE db.table.ID = ... LIMIT 1), wenn nicht, werden alle Werte angegeben: DELETE FROM ... WHERE db.table.column1 = 'foo' AND db.table.column2 = 'bar' AND db.table.column3 = 'foobar' And ... ... LIMIT 1

      Alex

      1. Schau doch mal, wie phpMyAdmin das macht:(...) wenn nicht, werden alle Werte angegeben: DELETE FROM ... WHERE db.table.column1 = 'foo' AND db.table.column2 = 'bar' AND db.table.column3 = 'foobar' And ... ... LIMIT 1

        keine schlechte Idee, werde mal versuchen das in mein Script einzubauen.

  4. echo $begrüßung;

    Jetzt gibt es das Problem: Wie lösche ich einen Eintrag?

    Mit DELETE, wie üblich. Die Frage sollte wohl eher lauten: Wie identifiziere ich einen Datensatz eindeutig?

    Meine Datenbanken enthalten zwar IMMER eine ID, dennoch würde ich es gerne so handhaben, dass ich nicht vorrausetzen muss, dass eine ID vorhanden sein muss, da ich das Programm auch dazu nutzen will, andere SQLite-Tabellen zu Analysieren. Und vllt benutze der Ersteller der Tabellen nicht ID-Einträge.

    Er setzt auf seine Spalte(n) mit dem Primärschlüssel, egal wie er sie nennt, den Primary Key Index. Ermittle diese Spalte(n), dann ist der Datensatz eindeutig identifizierbar. Ansonsten mach es wie der phpMyAdmin in dem Fall: Nimm alle Feldinhalte in die WHERE-Klausel und limitiere den Löschvorgang auf einen Datensatz. Hmm — scheint nicht vorgesehen zu sein, dass man bei DELETE ein LIMIT angeben kann. In dem Fall hat der Anwender Pech gehabt, denn wenn er keinen PK definiert, hat er das gleiche Problem beim Löschen wie du in deinem Admin-Tool.

    echo "$verabschiedung $name";

    1. ok?

      Jetzt gibt es das Problem: Wie lösche ich einen Eintrag?

      war eine Zusammenfassung des vorher dargestellten Problemes.

      Und insgesamt kann ich eigentl. nur sagen: du hast hier nur wiederholt was entweder vorher mal gesagt wurde ODER was ich als Problem angegeben habe ;-) aber trotzdem danke für die Mühe. Und der Anwender letzendl. bin ich und ich will aber kein Pech haben

      1. Hallo,

        Und insgesamt kann ich eigentl. nur sagen: du hast hier nur wiederholt was entweder vorher mal gesagt wurde ODER was ich als Problem angegeben habe ;-) aber trotzdem danke für die Mühe. Und der Anwender letzendl. bin ich und ich will aber kein Pech haben

        Beantworte Dir bitte ein paar Fragen:

        Wenn ein Datensatz nicht eindeutig identifizierbar ist, hast Du ein Problem.
        Wieviele solcher Datensätze musst Du infolgedessen übrig behalten?
        Kannst Du es derzeit in SQLite mit DELETE allein lösen?
        Mit welchem Workaround kämst Du dennoch zum Ziel?

        Fragende Grüße

        Vinzenz

        1. Beantworte Dir bitte ein paar Fragen:

          Wenn ein Datensatz nicht eindeutig identifizierbar ist, hast Du ein Problem.

          deswegen hab ich mich ja hier an das Forum gewandt

          Kannst Du es derzeit in SQLite mit DELETE allein lösen?

          Hab das Problem jetzt gelöst, indem ich jeden Datensatz in WHERE schreibe

          1. Hallo,

            Wenn ein Datensatz nicht eindeutig identifizierbar ist, hast Du ein Problem.
            deswegen hab ich mich ja hier an das Forum gewandt

            Kannst Du es derzeit in SQLite mit DELETE allein lösen?
            Hab das Problem jetzt gelöst, indem ich jeden Datensatz in WHERE schreibe

            Wenn es nun zwei gleiche Datensätze gibt? Dann sind beide weg ...
            Wieviele müssen jedoch übrig bleiben?
            Wie wäre es bei 10 gleichen Datensätzen?

            Ich frage daher nochmals:
            Kannst Du dies mit DELETE allein lösen?

            Freundliche Grüße

            Vinzenz

            1. Wenn es nun zwei gleiche Datensätze gibt? Dann sind beide weg ...
              Wieviele müssen jedoch übrig bleiben?
              Wie wäre es bei 10 gleichen Datensätzen?

              9 sollten dann noch übrig bleiben

              Ich frage daher nochmals:
              Kannst Du dies mit DELETE allein lösen?

              Theoretisch ja. Es habert nur leicht an der Idendifaktion der Zeilen. Habe es jetzt damit gemacht, dass ich alle Felder mit Inhalt angebe, welche ich Löschen will(ist halt nur problematisch, wenn 2 einträge zufällig gleiche einträge haben). Ich hatte gehoft, jmd hier im Forum könnte mir sagen, SQLite für jeden Eintrag eine Konstante beifügt(also sowas wie ein PK), welche immer gleich ist und über diese ich dann Einträge idendifizieren könnte.

              1. Hallo,

                Theoretisch ja. Es habert nur leicht an der Idendifaktion der Zeilen.

                warum liest Du nicht das Handbuch?

                Freundliche Grüße

                Vinzenz

      2. echo $begrüßung;

        Und insgesamt kann ich eigentl. nur sagen: du hast hier nur wiederholt was entweder vorher mal gesagt wurde ODER was ich als Problem angegeben habe ;-) aber trotzdem danke für die Mühe.

        Worauf ich hinaus wollte: Der Primary Key ist zwar oftmals "ID" benannt, aber das muss ja nicht so sein. Ermittle den Namen der Primary-Key-Spalten aus der von SQLite zur Verfügung gestellten Schema-Information. Dazu kann man die spezielle Tabelle sqlite_manager abfragen. Leider gibt es die Schema-Information nur in Form eines CREATE-TABLE-Kommando-Strings. Den müsstest du parsen, um daraus den PK-Namen zu erhalten. Was bei SQLite auch nicht geht, und ich vorher falsch annahm ist, den PK über mehr als eine Spalte zu legen.

        Und der Anwender letzendl. bin ich und ich will aber kein Pech haben

        Tja, ohne PK gibt es als eindeutigen Anfasser nur noch ... Unique-Keys, wenn einer gesetzt ist, wollt ich grad schreiben, aber  gut dass Vinzenz lesen kann :-) und auf ROWID verwies. Besser gehts ja gar nicht.

        echo "$verabschiedung $name";