Ich habe eine Tabelle gemäß den folgenden Anforderungen erstellt:
Später verwende ich in meinem Code Cursor, um eine Spalte _ID in der Tabelle zu erstellen
Da ich nur meinen eigenen Primärschlüssel verwenden möchte, stelle ich meine Spalte "Barcode" als einzigen Primärschlüssel ein.
Die Tabelle sieht also wie folgt aus:
CREATE TABLE product (
_id INTEGER,
barcode TEXT PRIMARY KEY NOT NULL,
title TEXT NOT NULL,
categoryid INTEGER NOT NULL,
FOREIGN KEY (categoryid) REFERENCES category (_id) ON DELETE CASCADE)
Die obige Tabelle wurde korrekt erstellt, aber ich brauche die _id -Spalte, um sie automatisch einzuinkeln, also ändere ich die Tabelle wie folgt:
CREATE TABLE product (
_id INTEGER AUTOINCREMENT NOT NULL,
barcode TEXT PRIMARY KEY NOT NULL,
title TEXT NOT NULL,
categoryid INTEGER NOT NULL,
FOREIGN KEY (categoryid) REFERENCES category (_id) ON DELETE CASCADE)
Beim Debuggen meiner App erhalte ich folgende Fehlermeldung:
near "AUTOINCREMENT": syntax error (code 1): , while compiling:
CREATE TABLE product (_id INTEGER AUTOINCREMENT NOT NULL,barcode TEXT PRIMARY KEY NOT NULL,title TEXT NOT NULL,categoryid INTEGER NOT NULL, FOREIGN KEY (categoryid) REFERENCES category (_id) ON DELETE CASCADE)
Ich brauche die Barcode-Spalte, um der einzige Primärschlüssel zu sein, aber die _ID-Spalte, um gleichzeitig automatisch einzugehen.
Ich könnte einen zusammengesetzten Primärschlüssel verwenden, der aus besteht_ID und Barcode, also kann _ID ohne Probleme auf Autoincrement gesetzt werden. Dabei könnte jedoch mehr als ein Produkt mit demselben Barcode (mit anderer _ID) eingefügt werden, und ich möchte, dass Barcode in der gesamten Tabelle eindeutig ist.
Wie kann man das loswerden?
Antworten:
2 für die Antwort № 1Können Sie ROWID in dieser Situation nicht verwenden? Es erledigt alles, was Sie fragen, und ist in die meisten sqlite-Tabellen eingebaut. Wählen Sie in Ihren Abfragen einfach X, Y, ROWID aus Z aus.
0 für die Antwort № 2
vom link: https://www.sqlite.org/autoinc.html, Auto-Inkrement kann nicht auf ein nicht primäres Feld gesetzt werden. Ich denke, Sie können die folgende Lösung ausprobieren. Es könnte helfen: SQLite-Inkrementierungsfeld für Nicht-Primärschlüssel