ATTACH DATABASE în SQLite

Deschide încă o bază de date în aceeași conexiune, ca să interoghezi sau să copiezi date între fișiere cu SQL obișnuit.

Sintaxă
ATTACH [DATABASE] 'fisier.db' AS schema;
DETACH [DATABASE] schema;
SELECT ... FROM schema.tabel;

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 comenzi când există același tabel în main și în baza atașată. Fără prefix, SQLite caută întâi în temp, apoi în main, 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.