Wie fügt man doppelte Zeilen in SQLite mit einer eindeutigen ID ein?

9

Das scheint einfach genug zu sein: Ich möchte eine Zeile in einer SQLite-Tabelle duplizieren:

%Vor%

Wenn es keine eindeutigen eindeutigen Spaltendeklarationen gäbe, würde die Anweisung funktionieren, aber die erste Spalte der Tabelle wird als rowID INTEGER NOT NULL PRIMARY KEY deklariert. Gibt es eine Möglichkeit, eine einfache Anweisung wie die obige zu erstellen, die funktioniert, ohne das Schema der Tabelle zu kennen (abgesehen von der ersten Spalte)?

    
Ed Marty 11.11.2009, 16:25
quelle

4 Antworten

5

Nun, da ich das nicht so machen konnte, wie ich es wollte, benutzte ich die implizite Zeilen-ID, die praktisch den gleichen Namen wie die explizit definierte rowId-Spalte hat. Jetzt kann ich also die Abfrage verwenden, die ich hatte in der Frage, und es wird alle Daten mit einer neuen rowId einfügen. Damit der Rest des Programms funktioniert, habe ich nur SELECT * FROM table in SELECT rowId,* FROM table geändert und alles ist in Ordnung.

    
Ed Marty 11.11.2009, 20:55
quelle
21

Dies kann mit * Syntax erfolgen, ohne das Schema der Tabelle kennen zu müssen (außer dem Namen des Primärschlüssels). Der Trick besteht darin, eine temporäre Tabelle mit der Syntax "CREATE TABLE AS" zu erstellen.

In diesem Beispiel nehme ich an, dass es eine existierende, bevölkerte Tabelle namens "src" mit einem INTEGER PRIMARY KEY namens "id" gibt, sowie einige andere Spalten. Um die Zeilen von "src" zu duplizieren, verwenden Sie die folgende SQL in SQLite3:

%Vor%

Das obige Beispiel dupliziert alle Zeilen der Tabelle "src". Um nur eine gewünschte Zeile zu duplizieren, fügen Sie einfach eine WHERE-Klausel zur ersten Zeile hinzu. Dieses Beispiel funktioniert, weil die Tabelle "tmp" keine Einschränkung für den Primärschlüssel hat, sondern "src". Das Einfügen von NULL-Primärschlüsseln in src bewirkt, dass ihnen automatisch generierte Werte zugewiesen werden.

Aus der sqlite-Dokumentation: Ссылка

  

Eine Anweisung "CREATE TABLE ... AS SELECT" erstellt und füllt eine Datenbanktabelle basierend auf den Ergebnissen einer SELECT-Anweisung. Eine mit CREATE TABLE AS erstellte Tabelle hat keinen PRIMARY KEY und keine Einschränkungen irgendeiner Art.

Wenn Sie wirklich schick werden möchten, können Sie einen Trigger hinzufügen, der eine dritte Tabelle aktualisiert, die alte Primärschlüssel neu generierten Primärschlüsseln zuordnet.

    
Seth Green 23.02.2012 17:44
quelle
8

Nein. Sie müssen das Schema der Tabelle kennen, um die INSERT-Anweisung richtig schreiben zu können.

Sie müssen die Anweisung in folgender Form schreiben können:

%Vor%     
Justin Niessner 11.11.2009 16:27
quelle
0

Absolut keine Möglichkeit, dies zu tun. Die Primärschlüssel-Deklaration impliziert, dass dieses Feld eindeutig ist. Sie können keine nicht eindeutige PK haben. Es gibt keine Möglichkeit, eine Zeile mit vorhandenem PK in derselben Tabelle zu erstellen.

    
Goran 11.11.2009 16:44
quelle

Tags und Links