Hi,
für ein bash-Skript benutze ich (bald) eine sqlite3-Datenbank, die u.a. folgende Tabelle enthält:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | CREATE TABLE tbl_urimark ( tbl_authorities_key INTEGER NOT NULL, id INTEGER PRIMARY KEY NOT NULL, ctime INTEGER NOT NULL DEFAULT (strftime('%s','now')), mtime INTEGER NOT NULL DEFAULT (strftime('%s','now')), tbl_schemes_key INTEGER NOT NULL, part TEXT NOT NULL, name TEXT NOT NULL DEFAULT 'null', desc TEXT NOT NULL DEFAULT 'null', tbl_hierarchies_key INTEGER NOT NULL DEFAULT '0', unique (tbl_schemes_key, tbl_authorities_key, part), FOREIGN KEY(tbl_authorities_key) REFERENCES tbl_authorities(key) ON UPDATE CASCADE, FOREIGN KEY(tbl_schemes_key) REFERENCES tbl_schemes(key) ON UPDATE CASCADE, FOREIGN KEY(tbl_hierarchies_key) REFERENCES tbl_hierarchies(key) ON UPDATE CASCADE ); |
Bei jedem INSERT, das innerhalb des Skripts ausgeführt ist, wird der ID explizit ein Wert > 0 zugeordnet. Dieser soll die niedrigste "Leerstelle" in der Menge aller derzeit benutzten IDs ausfüllen oder – falls keine Leerstelle(n) vorhanden sind – um eins größer sein als der höhste benutzte Wert. Habe ich "1 2 3 4", dann wird der Wert "5"; habe ich "1 3 4" oder "1 3 5", dann "2" usw. Dazu benutze ich derzeit diesen View, dessen Body ich aus dem Netz gefischt habe:
1 2 3 4 5 6 7 8 9 10 11 | CREATE VIEW view_calc_id_next AS SELECT id + 1 AS id_next FROM tbl_urimark UO WHERE NOT EXISTS ( SELECT NULL FROM tbl_urimark UI WHERE UI.id == UO.id + 1 ) ORDER BY id LIMIT 1 ; |
Mich stören daran zwei Dinge: (1) Wenn noch keine Records vorhanden sind, dann erhalte ich keine Ausgabe; (2) Der Code füllt nicht die Leerstelle "1" aus, sondern gibt stattdessen die höhste ROWID + 1 aus. Punkt (1) stört mich nicht sonderlich, weil ich darauf im Skript reagieren kann. Punkt (2) ist etwas nervig.
Weiß da jemand vllt weiter?
Gruß 🐸