Portál AbcLinuxu, 7. května 2025 13:01
CREATE TABLE popis ( id INTEGER PRIMARY KEY AUTOINCREMENT, text TEXT ); CREATE TABLE popis_obrazek ( id INT NOT NULL, src TEXT NOT NULL, FOREIGN KEY(id) REFERENCES popis(id) );A výsledkem parsování je takovýto soubor:
INSERT INTO popis (text) VALUES("Jakysi popis"); INSERT INTO popis_obrazek (id, src) VALUES((SELECT seq FROM sqlite_sequence WHERE name='popis'), 'obrazek1.jpg'); INSERT INTO popis_obrazek (id, src) VALUES((SELECT seq FROM sqlite_sequence WHERE name='popis'), 'obrazek2.jpg');A všechno pracuje jak má. Každý obrázek má id popisu, ke kterému patří. Napadlo mě vyhodit z tabulky popis ten sloupec id, vždyť je tam už rowid. Ale jak s ním pracovat v insertech, vždyť po prvním insertu do popis_obrazek se last_insert_rowid() změní. Našel jsem, že by to šlo oklikou přes pomocnou tabulku, ale zdá se mi to zbytečné. Je na to nějaký fígl, nebo je lepší nechat id a nepoužívat rowid? Díky za inspiraci.
CREATE TABLE popis ( text TEXT ); CREATE TABLE popis_obrazek ( id INT NOT NULL, src TEXT NOT NULL, FOREIGN KEY(id) REFERENCES popis(rowid) ); INSERT INTO popis (text) VALUES("Jakysi popis"); INSERT INTO popis_obrazek (id, src) VALUES((SELECT LAST_INSERT_ROWID()), 'obrazek1.jpg'), ((SELECT LAST_INSERT_ROWID()), 'obrazek2.jpg');To id v tabulce popis_obrazek tam být musí, identifikuje, ke kterému popisu obrázek patří. Děkuji mnohokráte za radu.
INSERT INTO popis VALUES('Jakysi popis') RETURNING rowid;A pozor, bez:
PRAGMA foreign_keys = ON;nebude fungovat kontrola referenční integrity.
CREATE TABLE popis_obrazek ( popis_rowid INTEGER NOT NULL, src TEXT NOT NULL, FOREIGN KEY(popis_rowid) REFERENCES popis(rowid) );Následně můžete vkládat do tabulky popis_obrazek pomocí příkazu INSERT s výrazem last_insert_rowid() pro získání posledního vloženého rowid:
INSERT INTO popis (text) VALUES("Jakysi popis"); INSERT INTO popis_obrazek (popis_rowid, src) VALUES(last_insert_rowid(), 'obrazek1.jpg'); INSERT INTO popis_obrazek (popis_rowid, src) VALUES(last_insert_rowid(), 'obrazek2.jpg');Tento způsob může být vhodný, pokud nepotřebujete sloupec id v tabulce popis a chcete využít automatického generování identifikátorů v SQLite pomocí rowid. Pokud ale potřebujete sloupec id v tabulce popis, je lepší ho ponechat a používat ho jako klíč pro odkazování v tabulce popis_obrazek. Toto je obecně považováno za lepší praxi, protože rowid může být přepsán při určitých operacích s tabulkou, například při přesunutí řádků nebo při vkládání řádků do středu tabulky. Klíče definované uživatelem (jako je id) jsou stabilnější a méně pravděpodobné, že se změní.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.