SQL Referência de PRAGMAs
Um PRAGMA é um comando do SQLite para consultar ou mudar um ajuste do próprio banco: ver as colunas de uma tabela, ligar as chaves estrangeiras, conferir se o arquivo está íntegro, saber o tamanho da página. Ao contrário dos comandos de ponto, ele é SQL (termina com ; e roda no editor, no PHP, no Python), mas é SQL só do SQLite: os outros bancos têm ajustes parecidos com outros nomes. Esta página lista os PRAGMAs mais úteis do SQLite 3.50.4, com a saída real em dois lugares: o editor do guia, que usa um banco em memória, e o terminal da Ana, com o arquivo loja.db. A aula que ensina os principais com calma é PRAGMAs Úteis.
- Ler um ajuste:
PRAGMA nome;. Mudar:PRAGMA nome = valor;. Os que olham uma tabela levam o nome dela entre parênteses:PRAGMA table_info(produtos);. - Quase todo PRAGMA que só lê também existe como tabela, com o prefixo
pragma_:SELECT * FROM pragma_table_info('produtos');. Assim dá para usarWHERE,ORDER BYeCOUNTno resultado. - Um PRAGMA com o nome errado não dá erro: o SQLite simplesmente ignora. Confira sempre se veio resposta.
- Alguns ajustes ficam gravados no arquivo (
user_version,journal_mode = WAL); outros valem só para a conexão e somem quando você fecha o banco (foreign_keys,cache_size).
Editor (memória) × terminal (arquivo)
No editor do guia, cada Rodar cria um banco novo, em memória, e carrega a Loja Aurora com PRAGMA foreign_keys = ON; no começo. No terminal, a Ana abre o arquivo loja.db com sqlite3 loja.db (aula O Terminal do SQLite). Por isso alguns PRAGMAs dão respostas diferentes nos dois lugares:
| PRAGMA | No editor | No terminal (loja.db) | Por quê |
|---|---|---|---|
foreign_keys | 1 | 0 | O editor liga ao carregar o banco; no terminal, toda conexão começa desligada |
journal_mode | memory | delete | Banco em memória não tem arquivo de diário no disco |
page_size | 8192 | 4096 | Cada um cria bancos novos com um tamanho padrão diferente: o SQLite do navegador usa 8192 bytes; o sqlite3 do terminal, 4096 |
page_count | 9 | 11 | Os mesmos dados, em páginas de tamanhos diferentes |
database_list | 0|main| (sem arquivo) | 0|main|/home/ana/loja.db | Em memória não há caminho de arquivo |
cache_size | -16384 | -2000 | Os dois foram compilados com padrões diferentes de cache (16 MiB × uns 2 MB) |
secure_delete | 0 | 1 | O sqlite3 do terminal vem com ele ligado: o que é apagado é sobrescrito com zeros no arquivo |
trusted_schema | 1 | 0 | O programa sqlite3 desliga |
Os PRAGMAs marcados "só com arquivo" nas tabelas abaixo rodam no editor, mas só fazem sentido no terminal (ou num programa) com um arquivo de verdade, porque o banco do editor some a cada Rodar.
Ver a estrutura das tabelas
| PRAGMA | O que mostra | Exemplo | Saída real (resumida) |
|---|---|---|---|
table_info(t) | Uma linha por coluna: posição (cid), nome, tipo, se é NOT NULL, o valor padrão e se faz parte da chave primária (pk) | PRAGMA table_info(categorias); | 0|id|INTEGER|0|NULL|11|nome|TEXT|1|NULL|02|descricao|TEXT|0|NULL|0 |
table_xinfo(t) | O mesmo, mais a coluna hidden (colunas escondidas e geradas) | PRAGMA table_xinfo(categorias); | 0|id|INTEGER|0|NULL|1|0 … |
table_list | Todas as tabelas: esquema, nome, tipo, nº de colunas, WITHOUT ROWID (wr) e STRICT | PRAGMA table_list; | main|produtos|table|7|0|0 … (9 linhas, contando as internas sqlite_schema e sqlite_temp_schema) |
index_list(t) | Os índices da tabela, se são únicos e a origem (pk = criado pela chave primária, c = CREATE INDEX, u = UNIQUE) | PRAGMA index_list(itens_pedido); | 0|sqlite_autoindex_itens_pedido_1|1|pk|0 |
index_info(i) | As colunas de um índice | PRAGMA index_info(sqlite_autoindex_itens_pedido_1); | 0|0|pedido_id1|1|produto_id |
index_xinfo(i) | O mesmo, com ordem (desc), collation e as colunas extras guardadas no índice | PRAGMA index_xinfo(sqlite_autoindex_itens_pedido_1); | 0|0|pedido_id|0|BINARY|1 … |
foreign_key_list(t) | As chaves estrangeiras da tabela: tabela e coluna de destino, ON UPDATE, ON DELETE | PRAGMA foreign_key_list(produtos); | 0|0|fornecedores|fornecedor_id|id|NO ACTION|NO ACTION|NONE1|0|categorias|categoria_id|id|NO ACTION|NO ACTION|NONE |
Todos funcionam igual no editor e no terminal. Aqui, o table_info rodando de verdade no banco da loja:
PRAGMA table_info(produtos);
Repare na coluna dflt_value: estoque e descontinuado têm o valor padrão 0 (aula DEFAULT); nas outras, NULL quer dizer "sem padrão". No terminal, com .headers on (aula Comandos de Ponto), a saída é a mesma, só que o NULL aparece vazio:
sqlite> .headers on sqlite> PRAGMA table_info(categorias); cid|name|type|notnull|dflt_value|pk 0|id|INTEGER|0||1 1|nome|TEXT|1||0 2|descricao|TEXT|0||0 sqlite> .mode box sqlite> PRAGMA foreign_key_list(produtos); ┌────┬─────┬──────────────┬───────────────┬────┬───────────┬───────────┬───────┐ │ id │ seq │ table │ from │ to │ on_update │ on_delete │ match │ ├────┼─────┼──────────────┼───────────────┼────┼───────────┼───────────┼───────┤ │ 0 │ 0 │ fornecedores │ fornecedor_id │ id │ NO ACTION │ NO ACTION │ NONE │ │ 1 │ 0 │ categorias │ categoria_id │ id │ NO ACTION │ NO ACTION │ NONE │ └────┴─────┴──────────────┴───────────────┴────┴───────────┴───────────┴───────┘
Como tabela: pragma_table_info
Na forma de tabela, dá para filtrar e contar. Quantas colunas tem cada tabela da loja?
SELECT m.name AS tabela, COUNT(*) AS colunas FROM sqlite_schema AS m, pragma_table_info(m.name) WHERE m.type = 'table' GROUP BY m.name;
A sqlite_schema é a tabela interna onde o SQLite guarda a lista das tabelas; para cada uma, o pragma_table_info(m.name) devolve as colunas, e o GROUP BY conta.
Experimente: troque pedidos pelo nome de outra tabela (clientes, itens_pedido…), ou troque table_info por foreign_key_list ou index_list.
PRAGMA table_info(pedidos);
Chaves estrangeiras e verificação
| PRAGMA | O que faz | Exemplo | Saída real | Vale para |
|---|---|---|---|---|
foreign_keys | Liga (ON) ou desliga (OFF) a checagem das chaves estrangeiras (aula FOREIGN KEY) | PRAGMA foreign_keys = ON; | Lendo: editor 1, terminal 0 | A conexão: some ao fechar |
foreign_key_check | Lista as linhas que apontam para uma linha que não existe | PRAGMA foreign_key_check; | Na Loja Aurora: nenhuma linha | — |
defer_foreign_keys | Deixa a checagem das chaves para o COMMIT da transação atual | PRAGMA defer_foreign_keys = ON; | Lendo: 0 | A transação |
integrity_check | Confere o banco inteiro (páginas, índices, NOT NULL…) e responde ok ou a lista de problemas | PRAGMA integrity_check; | ok | Só com arquivo faz sentido de verdade |
quick_check | Uma versão mais rápida do integrity_check (não confere se os índices batem com as tabelas) | PRAGMA quick_check; | ok | Idem |
No editor, as chaves estão ligadas: apagar a Papelaria, que tem produtos, dá erro.
DELETE FROM categorias WHERE id = 1;
Desligando as chaves antes, o DELETE passa, e o foreign_key_check mostra o estrago: seis produtos apontando para uma categoria que não existe mais.
PRAGMA foreign_keys = OFF; DELETE FROM categorias WHERE id = 1; PRAGMA foreign_key_check;
No terminal é o contrário: cada vez que a Ana abre o loja.db, as chaves começam desligadas, e ela precisa ligar de novo em toda sessão.
$ sqlite3 loja.db SQLite version 3.50.4 2025-07-30 19:33:53 Enter ".help" for usage hints. sqlite> PRAGMA foreign_keys; 0 sqlite> PRAGMA foreign_keys = ON; sqlite> PRAGMA foreign_keys; 1 sqlite> .quit $ sqlite3 loja.db "PRAGMA foreign_keys;" 0 « nova conexão: desligada de novo
O arquivo do banco (só com arquivo)
Estes PRAGMAs falam do arquivo .db: como ele grava, de que tamanho são as páginas, quanto espaço sobra. No editor eles respondem (com os valores de um banco em memória), mas só fazem sentido no terminal ou num programa que abre um arquivo.
| PRAGMA | O que faz | Exemplo | Terminal (loja.db) | Fica no arquivo? |
|---|---|---|---|---|
journal_mode | Como o SQLite protege as gravações: delete (o padrão), wal, truncate, persist, memory, off | PRAGMA journal_mode = WAL; | delete | wal fica; os outros, não |
synchronous | Quanto o SQLite espera o disco confirmar cada gravação: 0 OFF, 1 NORMAL, 2 FULL, 3 EXTRA | PRAGMA synchronous = NORMAL; | 2 | Não (conexão) |
page_size | O tamanho de cada página do arquivo, em bytes. Só muda num banco vazio ou com VACUUM | PRAGMA page_size; | 4096 | Sim |
page_count | Quantas páginas o arquivo tem | PRAGMA page_count; | 11 | — |
freelist_count | Quantas páginas estão vazias, esperando reaproveitamento (aula VACUUM e ANALYZE) | PRAGMA freelist_count; | 0 | — |
auto_vacuum | 0 NONE, 1 FULL, 2 INCREMENTAL: se o arquivo encolhe sozinho quando dados são apagados | PRAGMA auto_vacuum; | 0 | Sim |
incremental_vacuum | Devolve páginas vazias ao disco, no modo auto_vacuum = 2 | PRAGMA incremental_vacuum; | (sem saída) | — |
user_version | Um número livre, gravado no arquivo, para o seu programa saber a versão do banco | PRAGMA user_version = 3; | 0 | Sim |
application_id | Outro número livre, para marcar o arquivo como "do seu aplicativo" | PRAGMA application_id; | 0 | Sim |
encoding | A codificação dos textos do arquivo | PRAGMA encoding; | UTF-8 (no editor, só PRAGMA: ok) | Sim |
schema_version | Um contador que sobe a cada mudança de estrutura (CREATE, ALTER…). Só leia; nunca mude à mão | PRAGMA schema_version; | 7 | Sim |
database_list | Os bancos abertos na conexão e o arquivo de cada um | PRAGMA database_list; | 0|main|/home/ana/loja.db | — |
wal_checkpoint | No modo WAL, passa as gravações do arquivo -wal para o banco | PRAGMA wal_checkpoint; | 0|-1|-1 (não está em WAL) | — |
Página × tamanho do arquivo
O arquivo é feito de páginas do mesmo tamanho. Multiplicando um pelo outro, sai o tamanho do arquivo: 4096 × 11 = 45056 bytes, o mesmo que o ls -l mostra.
$ sqlite3 loja.db SQLite version 3.50.4 2025-07-30 19:33:53 Enter ".help" for usage hints. sqlite> PRAGMA database_list; 0|main|/home/ana/loja.db sqlite> PRAGMA page_size; 4096 sqlite> PRAGMA page_count; 11 sqlite> PRAGMA freelist_count; 0 sqlite> PRAGMA integrity_check; ok sqlite> .quit $ ls -l loja.db -rw-r--r-- 1 ana ana 45056 out 18 11:14 loja.db
O que fica gravado no arquivo
O user_version e o journal_mode = WAL continuam valendo depois de fechar e abrir o banco:
$ sqlite3 loja.db SQLite version 3.50.4 2025-07-30 19:33:53 Enter ".help" for usage hints. sqlite> PRAGMA user_version; 0 sqlite> PRAGMA user_version = 3; sqlite> .quit $ sqlite3 loja.db "PRAGMA user_version;" 3 « continuou 3: está no arquivo $ sqlite3 loja.db "PRAGMA user_version = 0;" $ sqlite3 loja.db SQLite version 3.50.4 2025-07-30 19:33:53 Enter ".help" for usage hints. sqlite> PRAGMA journal_mode; delete sqlite> PRAGMA journal_mode = WAL; wal sqlite> .quit $ sqlite3 loja.db "PRAGMA journal_mode;" wal « o modo WAL também ficou no arquivo $ sqlite3 loja.db "PRAGMA journal_mode = DELETE;" delete
Repare: PRAGMA journal_mode = WAL; responde com o modo que ficou valendo (wal), enquanto PRAGMA user_version = 3; não responde nada. No editor, o mesmo journal_mode = WAL responde memory: um banco em memória não tem para onde mudar.
A conexão: ajustes que valem até fechar
| PRAGMA | O que faz | Exemplo | Saída real (editor e terminal) |
|---|---|---|---|
cache_size | Quanta memória usar de cache. Número negativo = em KiB (−16384 = 16 MiB); positivo = em páginas | PRAGMA cache_size; | Editor -16384, terminal -2000 |
busy_timeout | Quantos milissegundos esperar quando outro programa está gravando no mesmo arquivo, antes de dar database is locked | PRAGMA busy_timeout = 5000; | Lendo: 0 (a coluna se chama timeout) |
temp_store | Onde guardar tabelas e índices temporários: 0 padrão, 1 arquivo, 2 memória | PRAGMA temp_store = MEMORY; | 0 |
case_sensitive_like | Faz o LIKE diferenciar maiúsculas de minúsculas (aula LIKE). Só se muda; não dá para ler | PRAGMA case_sensitive_like = ON; | (sem saída) |
recursive_triggers | Deixa um gatilho disparar outros gatilhos em cadeia | PRAGMA recursive_triggers; | 0 |
query_only | Com ON, a conexão só lê: qualquer INSERT, UPDATE ou DELETE dá attempt to write a readonly database | PRAGMA query_only = ON; | Lendo: 0 |
ignore_check_constraints | Com ON, ignora os CHECK (aula CHECK). Perigoso | PRAGMA ignore_check_constraints; | 0 |
automatic_index | Deixa o SQLite criar índices temporários sozinho para acelerar uma consulta | PRAGMA automatic_index; | 1 |
trusted_schema | Se funções e tabelas virtuais podem ser usadas dentro de views e gatilhos guardados no arquivo | PRAGMA trusted_schema; | Editor 1, terminal 0 |
optimize | Atualiza as estatísticas que ajudam o planejador de consultas. Bom de rodar antes de fechar um banco usado por muito tempo (aula Quando o Índice Ajuda) | PRAGMA optimize; | (sem saída) |
Um exemplo no editor: com case_sensitive_like ligado, 'ana%' com a minúsculo não acha mais "Ana Beatriz" nem "Ana Carvalho".
PRAGMA case_sensitive_like = ON; SELECT COUNT(*) AS anas FROM clientes WHERE nome LIKE 'ana%';
Informações sobre o próprio SQLite
Estes não mexem em nada; respondem "o que este SQLite sabe fazer". Os números mudam entre o editor e o terminal, porque os dois foram compilados com opções diferentes, e o programa sqlite3 traz extensões a mais (como generate_series, que não existe no editor).
| PRAGMA | O que lista | Editor | Terminal |
|---|---|---|---|
compile_options | As opções com que o SQLite foi compilado | 55 linhas | 58 linhas |
function_list | Todas as funções disponíveis (s = função comum; w = agregada ou de janela, porque toda agregada também serve como função de janela) | 171 linhas | 228 linhas |
pragma_list | Todos os PRAGMAs que existem | 64 linhas | 66 linhas |
module_list | Os módulos de tabela virtual | inclui fts5, rtree, json_each, bytecode | 21 módulos: também generate_series, zipfile, fsdir, fts3/fts4; sem bytecode |
collation_list | As regras de ordenação de texto | RTRIM, NOCASE, BINARY | também decimal e uint |
Para contar você mesmo, use a forma de tabela: SELECT COUNT(*) FROM pragma_function_list;. Rode no editor e compare com a tabela acima.
Quando dá errado
A Ana digitou foreing em vez de foreign:
sqlite> PRAGMA foreing_keys; sqlite> PRAGMA table_info(produto); sqlite>
O que aconteceu: silêncio. Um PRAGMA desconhecido é ignorado, sem mensagem; no editor, ele aparece só como PRAGMA: ok. O mesmo com o nome de tabela errado no table_info (produto no lugar de produtos): o editor mostra uma tabela vazia, e o terminal, nada. Se um PRAGMA de leitura não respondeu, desconfie da grafia.
BEGIN; PRAGMA foreign_keys = OFF; PRAGMA foreign_keys; COMMIT;
O que aconteceu: o foreign_keys continuou 1. Com uma transação aberta (aula Transações), o SQLite ignora a mudança desse PRAGMA, de novo sem erro. Mude-o antes do <
encoding no editor
No terminal, o encoding responde nas duas formas:
sqlite> PRAGMA encoding; UTF-8 sqlite> SELECT * FROM pragma_encoding; UTF-8
No editor do guia é diferente: PRAGMA encoding; aparece só como PRAGMA: ok, sem tabela, e SELECT * FROM pragma_encoding; dá o erro no such table: pragma_encoding. É uma diferença do SQLite do navegador; o texto do banco do editor também é UTF-8. Para conferir a codificação de um arquivo de verdade, use o terminal.
PRAGMA é só do SQLite. Nos outros, as mesmas informações vêm de outros lugares: o padrão SQL tem as views do INFORMATION_SCHEMA (por exemplo, INFORMATION_SCHEMA.COLUMNS para as colunas de uma tabela), que o MySQL, o PostgreSQL e o SQL Server oferecem; e os ajustes de conexão usam comandos próprios, como SET. O grupo As Diferenças entre os Bancos mostra cada um.
Missão: as colunas que aceitam NULL
Missão: a consulta lista as 7 colunas da tabela clientes. A Ana quer só as que aceitam NULL: as que têm notnull igual a 0. Dica: como notnull também é uma palavra do SQL, escreva o nome da coluna entre aspas duplas, "notnull".
SELECT name
FROM pragma_table_info('clientes');
SELECT name
FROM pragma_table_info('clientes')
WHERE "notnull" = 0;
Resumo
PRAGMA nome;lê um ajuste;PRAGMA nome = valor;muda. A formaSELECT … FROM pragma_nome(…)deixa filtrar o resultado.- Estrutura:
table_info,table_list,index_list,index_info,foreign_key_list. Funcionam igual no editor e no terminal. foreign_keysvale por conexão: ligado no editor, desligado em cadasqlite3 loja.db.foreign_key_checkeintegrity_checkconferem o banco.journal_mode,page_size,page_count,auto_vacuum,user_version: só fazem sentido com arquivo.user_versione o modo WAL ficam gravados nele.- Nome errado não dá erro: o PRAGMA é ignorado. Mudar
foreign_keysdentro de uma transação também. - PRAGMA é só do SQLite; nos outros bancos, procure o
INFORMATION_SCHEMA.