Ce face ATTACH DATABASE
Într-o conexiune SQLite, baza principală se numește main, iar cea temporară temp. Cu ATTACH 'arhiva.db' AS arhiva mai adaugi o bază, iar tabelele ei le folosești cu prefixul schemei: arhiva.comenzi. Dacă fișierul nu există, este creat.
Poți face JOIN între tabele din baze diferite și poți copia date dintr-una în alta cu INSERT INTO ... SELECT. O tranzacție care modifică mai multe baze atașate este atomică pentru toate (cu excepția modului WAL, unde fiecare bază este atomică separat).
Implicit poți atașa cel mult 10 baze. DETACH închide o bază atașată; nu merge în timpul unei tranzacții deschise. Lista bazelor atașate o vezi cu PRAGMA database_list sau cu .databases în utilitarul sqlite3.
Parametri
| Parametru | Descriere |
|---|---|
'fisier.db' |
Calea fișierului; ':memory:' atașează o bază nouă în memorie. |
schema |
Numele sub care folosești baza în interogări. |
Exemple
Exemplul 1: Mutarea comenzilor vechi într-o arhivă
Comenzile din 2025 sunt copiate în arhiva.db și șterse din baza principală, în aceeași tranzacție.
CREATE TABLE comenzi (id INTEGER PRIMARY KEY, client TEXT, data TEXT, total INTEGER);
INSERT INTO comenzi VALUES
(1, 'Ana', '2025-11-03', 250),
(2, 'Mihai', '2025-12-20', 120),
(3, 'Elena', '2026-02-14', 400);
ATTACH 'arhiva.db' AS arhiva;
CREATE TABLE arhiva.comenzi AS SELECT * FROM comenzi WHERE 0;
BEGIN;
INSERT INTO arhiva.comenzi SELECT * FROM comenzi WHERE data < '2026-01-01';
DELETE FROM comenzi WHERE data < '2026-01-01';
COMMIT;
SELECT 'main' AS baza, count(*) AS comenzi FROM main.comenzi
UNION ALL
SELECT 'arhiva', count(*) FROM arhiva.comenzi;
Rezultat
╭────────┬─────────╮
│ baza │ comenzi │
╞════════╪═════════╡
│ main │ 1 │
│ arhiva │ 2 │
╰────────┴─────────╯
Exemplul 2: JOIN între două baze
Prețurile stau într-o bază separată, atașată în memorie. Interogarea leagă tabelele din cele două baze ca pe tabele obișnuite. În lista bazelor, numărul 1 este rezervat bazei temp, care apare doar după ce creezi ceva temporar.
CREATE TABLE cos (produs TEXT, cantitate INTEGER);
INSERT INTO cos VALUES ('Caiet', 3), ('Pix', 10);
ATTACH ':memory:' AS catalog;
CREATE TABLE catalog.preturi (produs TEXT PRIMARY KEY, pret INTEGER);
INSERT INTO catalog.preturi VALUES ('Caiet', 12), ('Pix', 5);
SELECT c.produs, c.cantitate * p.pret AS lei
FROM cos c JOIN catalog.preturi p ON p.produs = c.produs
ORDER BY c.produs;
SELECT seq, name FROM pragma_database_list ORDER BY seq;
Rezultat
╭────────┬─────╮
│ produs │ lei │
╞════════╪═════╡
│ Caiet │ 36 │
│ Pix │ 50 │
╰────────┴─────╯
╭─────┬─────────╮
│ seq │ name │
╞═════╪═════════╡
│ 0 │ main │
│ 2 │ catalog │
╰─────┴─────────╯
Greșeli frecvente
- Scrii doar
comenzicând există același tabel înmainși în baza atașată. Fără prefix, SQLite caută întâi întemp, apoi înmain, apoi în bazele atașate, în ordine; pune prefixul ca să fie clar. - Atașezi cu o cale relativă și te miri că s-a creat un fișier gol. Calea este relativă la directorul curent al programului, nu la baza principală.
Comenzi înrudite
.open: Închide baza curentă și deschide (sau creează) alt fișier de bază de date, fără să ieși din sqlite3.VACUUM: Reconstruiește fișierul bazei de date: eliberează spațiul rămas după ștergeri și, cu INTO, face o copie compactă.BEGIN, COMMIT, ROLLBACK: Grupează mai multe modificări într-o tranzacție: fie se salvează toate cu COMMIT, fie niciuna cu ROLLBACK..dump: Scrie toată baza de date (sau doar unele tabele) ca instrucțiuni SQL, bune pentru backup, transfer sau control al versiunilor.