Aufgrund der Tatsache, dass Sie die neue Tabelle nicht erweitern/aktualisieren müssen, können Sie einfach einen Trigger überspringen und müssen sich keine Gedanken darüber machen, was die Daten einfügen.
So können Sie nur eine neue Version Ihrer Tabelle erstellen, "Idata".
Dann überprüfen Sie das Ergebnis und, wenn Sie es mögen, lassen Sie die alte Tabelle fallen und benennen Sie die neue um.
(I bieten keinen Code für das, weil ich die Datenbank getötet nicht der Autor des Codes haben will. ;-) Es scheint, altes und ist wahrscheinlich zu ersetzen nicht einfach.)
Ich habe meine MCVE für dein Problem, es ist am Ende der Antwort.
Bitte denken Sie darüber nach, einen für Ihre nächste SQLite-Frage bereitzustellen.
Hinweis:
Sie können nur die Tabelle "idxdata" verwenden. Es besteht nur aus den nicht redundanten Einträgen in "Daten". Das würde viel Platz sparen, besonders wenn "Daten" wirklich so groß sind, wie Sie sagen.
In diesem Fall sollten Sie das Schlüsselwort "temporary" entfernen. Und nicht den Code von create table idata
überhaupt verwenden.
create temporary table idxdata
(QUOTE_DATE date,
EXPIRATION date,
STRIKE int,
OPTION_TYPE CHAR(1),
idx integer primary key
);
insert into idxdata
select distinct
QUOTE_DATE,
EXPIRATION,
STRIKE,
OPTION_TYPE,
NULL
from data;
Inhalt von "idxdata":
2012-01-03|2012-01-06|1000|C|1
2012-01-04|2012-01-07|1000|C|2
2012-01-04|2012-01-07|1000|B|3
2012-02-04|2012-02-07|1000|B|4
mehr Code für Daten IDATA, mit zusätzlicher idx Säule erstreckt):
create table idata
(QUOTE_DATE date,
EXPIRATION date,
STRIKE int,
OPTION_TYPE CHAR(1),
idx integer);
insert into idata
select *
from data
join idxdata
using (QUOTE_DATE, EXPIRATION, STRIKE, OPTION_TYPE);
select * from idata;
OUTPUT:
QUOTE_DATE EXPIRATION STRIKE OPTION_TYPE idx
---------- ---------- ---------- ----------- ----------
2012-01-03 2012-01-06 1000 C 1
2012-01-03 2012-01-06 1000 C 1
2012-01-03 2012-01-06 1000 C 1
2012-01-03 2012-01-06 1000 C 1
2012-01-04 2012-01-07 1000 C 2
2012-01-04 2012-01-07 1000 C 2
2012-01-04 2012-01-07 1000 C 2
2012-01-04 2012-01-07 1000 B 3
2012-01-04 2012-01-07 1000 B 3
2012-02-04 2012-02-07 1000 B 4
2012-02-04 2012-02-07 1000 B 4
2012-02-04 2012-02-07 1000 B 4
MCVE-Stiftung:
CREATE TABLE data(QUOTE_DATE date, EXPIRATION date, STRIKE int, OPTION_TYPE CHAR(1));
INSERT INTO data(QUOTE_DATE,EXPIRATION,STRIKE,OPTION_TYPE) VALUES('2012-01-03','2012-01-06',1000,'C');
INSERT INTO data(QUOTE_DATE,EXPIRATION,STRIKE,OPTION_TYPE) VALUES('2012-01-03','2012-01-06',1000,'C');
INSERT INTO data(QUOTE_DATE,EXPIRATION,STRIKE,OPTION_TYPE) VALUES('2012-01-03','2012-01-06',1000,'C');
INSERT INTO data(QUOTE_DATE,EXPIRATION,STRIKE,OPTION_TYPE) VALUES('2012-01-03','2012-01-06',1000,'C');
INSERT INTO data(QUOTE_DATE,EXPIRATION,STRIKE,OPTION_TYPE) VALUES('2012-01-04','2012-01-07',1000,'C');
INSERT INTO data(QUOTE_DATE,EXPIRATION,STRIKE,OPTION_TYPE) VALUES('2012-01-04','2012-01-07',1000,'C');
INSERT INTO data(QUOTE_DATE,EXPIRATION,STRIKE,OPTION_TYPE) VALUES('2012-01-04','2012-01-07',1000,'C');
INSERT INTO data(QUOTE_DATE,EXPIRATION,STRIKE,OPTION_TYPE) VALUES('2012-01-04','2012-01-07',1000,'B');
INSERT INTO data(QUOTE_DATE,EXPIRATION,STRIKE,OPTION_TYPE) VALUES('2012-01-04','2012-01-07',1000,'B');
INSERT INTO data(QUOTE_DATE,EXPIRATION,STRIKE,OPTION_TYPE) VALUES('2012-02-04','2012-02-07',1000,'B');
INSERT INTO data(QUOTE_DATE,EXPIRATION,STRIKE,OPTION_TYPE) VALUES('2012-02-04','2012-02-07',1000,'B');
INSERT INTO data(QUOTE_DATE,EXPIRATION,STRIKE,OPTION_TYPE) VALUES('2012-02-04','2012-02-07',1000,'B');
Verwendung: SQLite 3.18.0 2017-03-28
Was Sie diese neue Spalte dachte aussehen würde? Und in Ihrem Beispiel von "SELECT * FROM DATA WO INDEX = i", wie würde "ich" aussehen? Ich glaube nicht, dass "index" bedeutet, was Sie denken, dass es bedeutet, also kann es helfen, wenn Sie mehr über genau erklären, was Sie die Datenbank fragen möchten, und was Sie erwarten, dass die Ergebnisse Ihrer Frage sind. (Ein "Index", in der Datenbank ausgedrückt, ist ein Gerät, das Nachschlagen auf bestimmten Schlüsseln in der Datenbank beschleunigen kann; es wird nicht als sichtbare Spalte verfügbar sein.) –
Hey @MattGibson, danke für deine Hilfe! Ich denke, es ist einfacher, mit 1 Spalte zu erklären und von dort zu erweitern. Nehmen wir an, die ersten 10 Zeilen dieser Spalte haben den gleichen Wert, dann wäre der Index 1. Und dann hat die nächste Zeile einen anderen Wert, und es wiederholt sich für 4 Zeilen, dann wäre der Index 2. Und die nächste Zeile hat einige anderen Wert, und es wird für 23 Zeilen wiederholt, dann wäre der Index 3, und so weiter. Die gleiche Idee für 4 Spalten, aber wenn sich eine der Spalten ändert, würde sich der Index ändern. –
@MattGibson würde es sein, als würde man 'SELECT * FROM DATEN WHERE COL1 = 1stvalForCol1, COL2 = 1stvalForCol2, COL3 = 1stvalForCol3, COL4 = 1stvalForCol4', diese Abfrage zurückholen, tun, was ich tun muss, und dann weiter zu' SELECT gehen * FROM DATEN WHERE COL1 = 2ndvalForCol1, COL2 = 1stvalForCol2, COL3 = 1stvalForCol3, COL4 = 1stvalForCol4' und so weiter. Aber anstatt alle möglichen Werte für jede Spalte kennen zu müssen (was lange dauern würde, um das herauszufinden, weil die Datenbank ziemlich groß ist), könnte ich einfach 'WHERE INDEX = i 'machen und' i' ändern. –