ROWID INTEGER PRIMARY KEY AUTOINCREMENT – Wie fügt man Werte ein?

Lesezeit: 2 Minuten

Antheas Benutzeravatar
Anthea

Ich habe eine SQLite-Tabelle in Java erstellt:

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

Ich habe versucht, Zeilen hinzuzufügen:

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

Fehler:

java.sql.SQLException: Tabellenteilnehmer hat 3 Spalten, aber es wurden 2 Werte angegeben

ich dachte ROWID würden automatisch generiert. 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();

Ich habe eine Nullzeiger-Ausnahme bei erhalten 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");

  • 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

Padhus Benutzeravatar
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.

Antheas Benutzeravatar
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 Spalten in der Tabelle vorhanden sind, 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);

Kai - Benutzeravatar von Kazuya Ito
Kai – Kazuya Ito

Sie erstellen zum Beispiel Tabelle “Person”. mit “Ich würde” mit AUTOINKREMENT und “Name” Wie nachfolgend dargestellt:

CREATE TABLE person (    -- Here
  id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
  name TEXT
);

Dann einstellen NULL zu “Ich würde” von AUTOINKREMENT Wie nachfolgend dargestellt. *Sie können festlegen NULL zu “Ich würde” was hat NICHT NULL Weil “Ich würde” hat INTEGER PRIMÄRSCHLÜSSEL:

INSERT INTO person VALUES (NULL, "John"), (NULL, "Tom");

Jetzt können Sie Zeilen wie unten gezeigt einfügen:

sqlite> SELECT * FROM person;
┌────┬──────┐
│ id │ name │
├────┼──────┤
│ 1  │ John │
│ 2  │ Tom  │
└────┴──────┘

1431190cookie-checkROWID INTEGER PRIMARY KEY 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