Ina: sqlite autoincrement

Hallo, eine ewige Geschichte voller Missverständnisse.

Ich beschäftige mich immer mal wieder mit sqlite um dann doch reumütig zu Mysql zurückzukehren. Aber dann packt es mich wieder und ich nehme einen neuen Anlauf. Eines der immer wiederkehrenden Probleme ist autoincrement.

Man liest im Netz und in den Dokus und am Ende ist man so schlau als wie zuvor. Warum? Weil offensichtlich jeder eine andere Meinung dazu hat.

Gibt es das Attribut: autoincrement oder AUTO_INCREMENT bei sqlite?

Laut Doku anscheinend NEIN http://sqlite.org/faq.html#q1

Laut vielen Foren/Tutorials offensichtlich doch:  CREATE TABLE ABTEILUNGEN(ABT_ID integer  AUTO_INCREMENT PRIMARY KEY,

Nun wie auch immer, egal was ich versuche, entweder kommen Error-meldungen ala "sqlite_query() [function.sqlite-query]: datatype mismatch", oder es geht schlichtweg einfach nicht.

Das eigentliche Ziel dabei ist, wie bei Mysql, einfach diese Spalte im insert leer zu lassen und die DB produziert einen sichtbaren Wert hinein.

ID  TEXT_1     TEXT_2
1   blabla     bla2
2   blabla     bla2
3   blabla     bla2
4   blabla     bla2

Gruss
Ina

  1. Hi,

    Gibt es das Attribut: autoincrement oder AUTO_INCREMENT bei sqlite?
    Laut Doku anscheinend NEIN http://sqlite.org/faq.html#q1

    etwas mit diesem Namen gibt es offenbar bei SQLite nicht. Bei Oracle aber auch nicht. Warum? Weil der Name völlig egal ist. Es wird lediglich ein Mechanismus benötigt, der das überschneidungsfreie Setzen eines neuen Primary Keys ermöglicht - und exakt an der von Dir verlinkten Stelle wird eben dies beschrieben.

    Das eigentliche Ziel dabei ist, wie bei Mysql, einfach diese Spalte im insert leer zu lassen und die DB produziert einen sichtbaren Wert hinein.

    Folge der von Dir verlinkten Beschreibung.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Hi Cheetah ach Nein du schreibst dich ja Cheatah;-),

      Folge der von Dir verlinkten Beschreibung.

      »»

      Danke, aber

      "....the NULL is automatically converted into an integer..."

      das habe ich natürlich versucht, aber da scheine ich nicht zu verstehen, was die NULL meinen, denn egal was ich eintrage('',"",0,NULL) oder einfach leer lasse, es gibt Fehler oder passiert nichts, mit Ausnahme der Ziffer 0, die schreibt er dann auch wirklich rein, aber das ist ja nicht der Sinn.

      Ina

      1. Hallo Ina,

        das habe ich natürlich versucht, aber da scheine ich nicht zu verstehen, was die NULL meinen, denn egal was ich eintrage('',"",0,NULL)

        Die Zahl 0 oder eine leere Zeichenkette sind etwas völlig anderes als der spezielle Wert NULL. Da gibt es in SQL nichts zu probieren.
        Die verlinkte Doku gibt doch ein Beispiel mit dem speziellen Wert NULL an, ist der bei Dir wirklich fehlgeschlagen?

        Freundliche Grüße

        Vinzenz

        1. Hallo Vinzenz,

          Die verlinkte Doku gibt doch ein Beispiel mit dem speziellen Wert NULL an, ist der bei Dir wirklich fehlgeschlagen?

          Ja, autsch.
          Weil ein Script, was ich dazu nutze automatisch NULL in Anführungszeichen setzt. INSERT INTO t1 (a,b) VALUES ('NULL','test').

          Das wars also, danke.

          Aber nochmal, um sicherzugehen, das Script im wikibook ist also falsch?

          Bzw. auch wenn AUTO_INCREMENT keine Wirkung hat(hat es ja nicht?), darf es trotzdem drin stehen, sozusagen als Hilfsmittel, für eine später eventuelle Exportierung zu Mysql?

          Gruss
          Ina

          1. Hallo Ina,

            Weil ein Script, was ich dazu nutze automatisch NULL in Anführungszeichen setzt. INSERT INTO t1 (a,b) VALUES ('NULL','test').

            Das wars also, danke.

            bitte.

            Aber nochmal, um sicherzugehen, das Script im wikibook ist also falsch?

            Gemäß SQLite-Dokumentation ist das Script falsch.

            Bzw. auch wenn AUTO_INCREMENT keine Wirkung hat(hat es ja nicht?), darf es trotzdem drin stehen, sozusagen als Hilfsmittel, für eine später eventuelle Exportierung zu Mysql?

            Wenn SQLite vernünftigerweise das Statement wegen Syntaxfehler nicht verarbeitet, dann ist das keine gute Idee. SQLite hat nach meinem Kenntnisstand nicht das Ziel, MySQL-kompatibel zu sein.

            Freundliche Grüße

            Vinzenz

          2. yo,

            Weil ein Script, was ich dazu nutze automatisch NULL in Anführungszeichen setzt. INSERT INTO t1 (a,b) VALUES ('NULL','test').

            noch ein tipp, deine probleme wären erst gar nicht aufgetreten, wenn du die PK spalte bei der Insert anweisung einfach weg läßt und spart auch noch tippartbeit.

            Aber nochmal, um sicherzugehen, das Script im wikibook ist also falsch?

            wie Vinzenz schon sagte, scheint das script bei wiki falsch zu sein. aber auch bei der sqllite doku habe ich meine bedenken, wenn so was behauptet wird:

            INSERT INTO t1 VALUES(NULL,123);

            is logically equivalent to saying:

            INSERT INTO t1 VALUES((SELECT max(a) FROM t1)+1,123);

            wenn das einer meiner Arbeitskollegen (entwickler) tun würde, ich würde ihm....

            Ilja

            1. wobei ich mich selbst gleich wieder korregieren muss, da die select anweisung in einem insert statement steht. auf die finger hauen würde ich meinen kollegen trotzdem ;-)

              Ilja

  2. (Hallo|Hi(ho)|Tag) Ina,

    Ich beschäftige mich immer mal wieder mit sqlite um dann doch reumütig zu Mysql zurückzukehren.

    Nur weil das eine Stück Software etwas nicht tun kann, was ein anderes kann, heißt das nicht, dass ersteres das schlechtere Exemplar darstellt.

    Aber dann packt es mich wieder und ich nehme einen neuen Anlauf. Eines der immer wiederkehrenden Probleme ist autoincrement.

    Man liest im Netz und in den Dokus und am Ende ist man so schlau als wie zuvor. Warum? Weil offensichtlich jeder eine andere Meinung dazu hat.

    AUTO(_)INCREMENT ist nicht wirklich eine gute Idee. Schau dir dazu mal den Eintrag im SQLite-Wiki zu nicht unterstützten Eigenschaften anderer SQL-Dialekte an (nach "AUTO_INCREMENT" und "stop the evil from spreading" suchen).

    Gibt es das Attribut: autoincrement oder AUTO_INCREMENT bei sqlite?

    Nein, aber es gibt seit der Version 3.1 vom Januar 2005 als Constraint den Wert "AUTOINCREMENT", wie du in der (richtigen) Dokumentation nachlesen kannst:

    column-constraint ::= NOT NULL [ conflict-clause ] |
                          PRIMARY KEY [sort-order] [ conflict-clause ] [AUTOINCREMENT] |
                          UNIQUE [ conflict-clause ] |
    ...

    http://sqlite.org/lang_createtable.html

    Laut Doku anscheinend NEIN http://sqlite.org/faq.html#q1

    Keine Ahnung, warum das in den FAQ nicht berücksichtigt wird, denn anscheinend ist es ein vor allem von MySQL-Fans immer wieder gerne nachgefragtes "Feature" ... ;-)

    Laut vielen Foren/Tutorials offensichtlich doch:  CREATE TABLE ABTEILUNGEN(ABT_ID integer  AUTO_INCREMENT PRIMARY KEY,

    Der Autor des Scripts behauptet ja, dass er es getestet hat. Allerdings verhält sich SQLite beim Basteln von Tabellen oft sehr tolerant gegenüber unbekannten Datentypen oder Constraints -- sprich: Es ignoriert die Anweisung einfach. Außerdem findet man ja "integer" und "PRIMARY KEY" in der create-Anweisung und das reicht ja laut deinem FAQ-Link auch. Es kommt also darauf an, wie man "getestet" definiert. ;-)

    Einen Punkt gibts noch zu bedenken, falls SQLite in Verbindung mit PHP eingesetzt wird: Die standardmäßig eingebaute SQLite-Extension von PHP unterstützt immer noch nur SQLite in der Version 2.8. Nur die PDO-Erweiterung kann mit SQLite 3 umgehen.

    MffG
    EisFuX