Portál AbcLinuxu, 2. června 2024 16:07


Dotaz: SQLite rowid nebo id

5.12.2022 14:28 Jirka
SQLite rowid nebo id
Přečteno: 1280×
Odpovědět | Admin
Ahoj, parsuji nějaká data a výsledkem by měl být textový SQL soubor, který se později nahraje do SQLite. V datech je nějaký popis jako krátký text a k němu může být několik obrázků (ale nemusí). Zhotovil jsem tuto jednoduchou databázi:
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.
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

5.12.2022 15:16 X
Rozbalit Rozbalit vše Re: SQLite rowid nebo id
Odpovědět | | Sbalit | Link | Blokovat | Admin
Rekl bych ,ze to 'id' je v obou pripadech zbytecne. K tomu vkladani muzes pouzit 'SELECT last_insert_rowid()' a teoreticky transakci, nebo sekvenci INSERT .. VALUE (A,B), (C,D);.
5.12.2022 16:02 Jirka
Rozbalit Rozbalit vše Re: SQLite rowid nebo id
Ano, sekvence v INSERT - to je řešení. Upravil jsem to takto:
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.
5.12.2022 17:53 .
Rozbalit Rozbalit vše Re: SQLite rowid nebo id
To je řešení ve stylu "jak si rozbít data". Zkuste si přečíst třeba tohle.
5.12.2022 18:35 X
Rozbalit Rozbalit vše Re: SQLite rowid nebo id
Nesmysl. Misto straseni to zkus priste realne podlozit. Mimochodem, informace na odkazu nijak tazatelovo reseni neovlivnuje.
5.12.2022 18:43 Jirka
Rozbalit Rozbalit vše Re: SQLite rowid nebo id
Aha, to by mohl být problém. Takže zpět na id, ovšem se sekvencí v INSERTu.
9.12.2022 12:31 Tom K | skóre: 21
Rozbalit Rozbalit vše Re: SQLite rowid nebo id
Odpovědět | | Sbalit | Link | Blokovat | Admin
Nepoužíval bych LAST_INSERT_ROWID, ale:
INSERT INTO popis VALUES('Jakysi popis') RETURNING rowid; 
A pozor, bez:
PRAGMA foreign_keys = ON;
nebude fungovat kontrola referenční integrity.
echo -n "u48" | sha1sum | head -c3; echo
30.12.2022 12:54 ChatBot GPT-3
Rozbalit Rozbalit vše Re: SQLite rowid nebo id
Odpovědět | | Sbalit | Link | Blokovat | Admin
Ano, v SQLite můžete použít speciální sloupec rowid, který zajišťuje unikátní identifikátor pro každý řádek v tabulce. Můžete tedy vytvořit tabulku popis_obrazek bez sloupce id a namísto toho použít sloupec rowid ze tabulky popis.

Vytvořte tabulku popis_obrazek takto:
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í.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.