Ich habe eine Tabelle in SQLite mithilfe der CREATE TABLE AS
Syntax erstellt, um eine Tabelle basierend auf einer SELECT
Anweisung zu erstellen . Jetzt hat diese Tabelle keinen Primärschlüssel, aber ich möchte einen hinzufügen.
Beim Ausführen ALTER TABLE table_name ADD PRIMARY KEY(col1, col2,...)
wird ein Syntaxfehler "in der Nähe von PRIMARY" ausgegeben.
Gibt es eine Möglichkeit, einen Primärschlüssel entweder während der Tabellenerstellung oder danach in Sqlite hinzuzufügen?
Mit "während der Schöpfung" meine ich während der Schöpfung mit CREATE TABLE AS
.
Antworten:
Sie können SQLite-Tabellen nach ihrer Erstellung nicht wesentlich ändern. Die akzeptierte vorgeschlagene Lösung besteht darin, eine neue Tabelle mit den richtigen Anforderungen zu erstellen, Ihre Daten darin zu kopieren und dann die alte Tabelle zu löschen.
Hier ist die offizielle Dokumentation dazu: http://sqlite.org/faq.html#q11
quelle
CREATE UNIQUE INDEX pkName ON tableName(columnName)
) hinzufügen, wenn DB-Frameworks wie MS SQLs SMO Sie tatsächlich dazu bringen , eine PK hinzuzufügen, nachdem die Tabelle erstellt wurde!Solange Sie
CREATE TABLE
den Primärschlüssel in einem einzelnen Feld erstellen , können Sie Folgendes verwenden:Mit
CREATE TABLE
können Sie auch immer den folgenden Ansatz verwenden, um einen Primärschlüssel für ein oder mehrere Felder zu erstellen :Referenz: http://www.sqlite.org/lang_createtable.html
Diese Antwort behandelt keine Tabellenänderungen.
quelle
Ich habe versucht, den Primärschlüssel anschließend hinzuzufügen, indem ich die Tabelle sqlite_master direkt geändert habe. Dieser Trick scheint zu funktionieren. Es ist natürlich eine Hack-Lösung.
Kurz gesagt: Erstellen Sie einen regulären (eindeutigen) Index für die Tabelle, machen Sie das Schema beschreibbar und ändern Sie den Namen des Index in das von sqlite reservierte Formular, um einen Primärschlüsselindex zu identifizieren (dh sqlite_autoindex_XXX_1, wobei XXX der Tabellenname ist). und setzen Sie die SQL-Zeichenfolge auf NULL. Ändern Sie zuletzt die Tabellendefinition selbst. Ein Pittfal: Bei SQLite wird der Indexname erst geändert, wenn die Datenbank erneut geöffnet wird. Dies scheint ein Fehler zu sein, aber kein schwerwiegender (auch ohne erneutes Öffnen der Datenbank können Sie sie weiterhin verwenden).
Angenommen, die Tabelle sieht folgendermaßen aus:
Dann habe ich folgendes gemacht:
Einige Tests (in SQLite-Shell):
quelle
Gemäß den SQLite- Dokumenten zur Tabellenerstellung wird durch die Verwendung der Tabelle zum Erstellen als Auswahl eine neue Tabelle ohne Einschränkungen und ohne Primärschlüssel erstellt.
In der Dokumentation heißt es jedoch auch, dass Primärschlüssel und eindeutige Indizes logisch äquivalent sind ( siehe Abschnitt Einschränkungen ):
Selbst wenn Sie Ihre Tabellendefinition nicht über die SQL-Änderungssyntax ändern können, können Sie durch die Verwendung eines eindeutigen Index denselben Primärschlüsseleffekt erzielen.
Außerdem hat jede Tabelle (mit Ausnahme derjenigen, die ohne die Rowid-Syntax erstellt wurden) eine innere Ganzzahlspalte, die als "Rowid" bezeichnet wird. Gemäß den Dokumenten können Sie diese innere Spalte verwenden, um Datensatztabellen abzurufen / zu ändern.
quelle
Sie können es so machen:
quelle
Einführung
Dies basiert auf Android Java und ist ein gutes Beispiel für das Ändern der Datenbank, ohne Ihre Anwendungsfans / Kunden zu stören. Dies basiert auf der Idee der SQLite-FAQ-Seite http://sqlite.org/faq.html#q11
Das Problem
Ich habe nicht bemerkt, dass ich eine Zeilennummer oder eine Datensatz-ID festlegen muss, um einen einzelnen gekauften Artikel in einer Quittung zu löschen, und gleichzeitig hat mich die Artikel-Barcode-Nummer dazu gebracht, darüber nachzudenken, ihn als Schlüssel zum Löschen dieses Artikels zu verwenden. Ich speichere eine Belegdetails in der Tabelle Receipt_Barcode. Wenn Sie es ohne record_id belassen, können Sie alle Datensätze desselben Artikels in einer Quittung löschen, wenn ich den Artikel-Barcode als Schlüssel verwendet habe.
Beachten
Bitte haben Sie Verständnis dafür, dass dies eine Kopie meines Codes ist, an dem ich zum Zeitpunkt des Schreibens arbeite. Verwenden Sie es nur als Beispiel. Das zufällige Kopieren und Einfügen hilft Ihnen nicht weiter. Ändern Sie dies zuerst an Ihre Bedürfnisse
Bitte vergessen Sie auch nicht, die Kommentare im Code zu lesen.
Der Code
Verwenden Sie dies als Methode in Ihrer Klasse, um zunächst zu überprüfen, ob die Spalte, die Sie hinzufügen möchten, fehlt. Wir tun dies nur, um den Vorgang des Änderns der Tabelle Receipt_Barcode nicht zu wiederholen. Erwähne es einfach als Teil deiner Klasse. Im nächsten Schritt werden Sie sehen, wie wir es verwenden werden.
Der folgende Code wird dann verwendet, um die Tabelle Receipt_Barcode zu erstellen, wenn sie bereits zum ersten Mal von Benutzern Ihrer App NICHT beendet wird . Und bitte beachten Sie das "WENN NICHT EXISTIERT" im Code. Es hat Bedeutung.
quelle
Ich hatte das gleiche Problem und die beste Lösung, die ich gefunden habe, besteht darin, zuerst die Tabelle zu erstellen, die den Primärschlüssel definiert, und dann insert in Anweisung zu verwenden.
quelle
Ich habe die CREATE TABLE AS-Syntax verwendet, um mehrere Spalten zusammenzuführen, und bin auf dasselbe Problem gestoßen. Hier ist ein AppleScript, das ich geschrieben habe, um den Prozess zu beschleunigen.
quelle
Ich denke, das Hinzufügen eines Index für diese Spalte kann fast den gleichen Effekt erzielen.
quelle
quelle
Verwenden Sie ein Tool wie DB Browser für SQLite. Es ermöglicht das Hinzufügen von PK, AI durch einfaches Klicken mit der rechten Maustaste auf Tabelle -> Ändern.
quelle