SQLite autoincrement – Wie fügt man Werte ein?

Lesezeit: 2 Minuten

Benutzer-Avatar
Anthea

Ich generiere eine SQLite-Tabelle (in Java):

create table participants (ROWID INTEGER PRIMARY KEY AUTOINCREMENT, col1,col2);

Danach versuche ich, Zeilen mit dem Befehl INSERT hinzuzufügen:

insert into participants values ("bla","blub");

Ich bekomme den Fehler:

java.sql.SQLException: table participants has 3 columns but 2 values were supplied

Ich dachte, die Zeilen-ID würde automatisch generiert, aber es scheint, dass ich etwas vermisse.


Ich habe eine andere Lösung versucht:

PreparedStatement prep = conn.prepareStatement("insert into participants values (?,?,?);");
Integer n = null;
prep.setInt(1,n);
prep.setString(2, "bla");
prep.setString(3, "blub");
prep.addBatch();
prep.executeBatch();

Als Ergebnis erhielt ich eine Nullzeiger-Ausnahme bei “prep.setInt(1,n);”

Siehst du den Fehler?

Haben Sie versucht anzugeben, auf welche Felder der Tabelle sich die übergebenen Parameter beziehen sollen?

INSERT INTO table_name (column1, column2, column3,...)
VALUES (value1, value2, value3,...)

In Ihrem Fall vielleicht so etwas wie:

INSERT INTO participants(col1, col2) VALUES ("bla","blub");

  • Ich denke, das würde funktionieren, ich habe einen anderen guten Weg gefunden und die Frage bearbeitet! Vielen Dank !

    – Anthea

    24. November 2011 um 0:19 Uhr


  • Dies ist der richtige Weg. Dies ist auch nicht spezifisch für SQLite.

    – Corey Ogburn

    28. August 2015 um 14:59 Uhr

  • Wenn Sie eine Schemamigration durchführen und eine Select-Anweisung für Ihre Einfügung verwenden, können Sie dies tun insert into participants(col1, col2) select col1, col2 from t1_backup;

    – mlissner

    25. September 2015 um 17:56 Uhr

Benutzer-Avatar
Padhu

Der einfachste Weg, ohne Spaltennamen zu verwenden, wird sein mit null anstelle von automatische Erhöhung ich mag das

insert into table values (null, col1, col2)

Wenn Sie die erste Spalte bereits als Autoinkrement festgelegt haben, funktioniert es einwandfrei.

Benutzer-Avatar
Anthea

habe hier eine funktionierende Lösung gefunden:

PreparedStatement prep = conn.prepareStatement("insert into participants values ($next_id,?,?);");
prep.setString(2, "bla");
prep.setString(3, "blub");

Der Grund für Ihren Fehler ist, dass SQL-Einfügungen erwarten, dass Sie die gleiche Anzahl von Werten bereitstellen, wie es Spalten in der Tabelle gibt, wenn kein Spaltenbezeichner verwendet wird.

dh wenn Sie eine SQL-Abfrage wie folgt schreiben:

INSERT INTO TableName VALUES(a1,a2, ...)

.. die Werte müssen genau in der gleichen Reihenfolge wie in der Tabellendefinition stehen (und auch in der gleichen Menge). Der Grund dafür ist, Mehrdeutigkeiten zu vermeiden und die Anzahl von Fehlern zu reduzieren.

In Ihrem Fall haben Sie eine Auto-Increment-Spalte, für die Sie keinen Wert angeben möchten. Das ist natürlich möglich, aber nach den obigen Regeln müssen Sie Spaltennamen angeben:

INSERT INTO TableName (columnName1, columnName2) VALUES(Value1, Value2);

1054420cookie-checkSQLite autoincrement – Wie fügt man Werte ein?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy