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.

As regras dos PRAGMAs
  • 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 usar WHERE, ORDER BY e COUNT no 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:

PRAGMANo editorNo terminal (loja.db)Por quê
foreign_keys10O editor liga ao carregar o banco; no terminal, toda conexão começa desligada
journal_modememorydeleteBanco em memória não tem arquivo de diário no disco
page_size81924096Cada um cria bancos novos com um tamanho padrão diferente: o SQLite do navegador usa 8192 bytes; o sqlite3 do terminal, 4096
page_count911Os mesmos dados, em páginas de tamanhos diferentes
database_list0|main| (sem arquivo)0|main|/home/ana/loja.dbEm memória não há caminho de arquivo
cache_size-16384-2000Os dois foram compilados com padrões diferentes de cache (16 MiB × uns 2 MB)
secure_delete01O sqlite3 do terminal vem com ele ligado: o que é apagado é sobrescrito com zeros no arquivo
trusted_schema10O 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

PRAGMAO que mostraExemploSaí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|1
1|nome|TEXT|1|NULL|0
2|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_listTodas as tabelas: esquema, nome, tipo, nº de colunas, WITHOUT ROWID (wr) e STRICTPRAGMA 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 índicePRAGMA index_info(sqlite_autoindex_itens_pedido_1);0|0|pedido_id
1|1|produto_id
index_xinfo(i)O mesmo, com ordem (desc), collation e as colunas extras guardadas no índicePRAGMA 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 DELETEPRAGMA foreign_key_list(produtos);0|0|fornecedores|fornecedor_id|id|NO ACTION|NO ACTION|NONE
1|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

PRAGMAO que fazExemploSaída realVale para
foreign_keysLiga (ON) ou desliga (OFF) a checagem das chaves estrangeiras (aula FOREIGN KEY)PRAGMA foreign_keys = ON;Lendo: editor 1, terminal 0A conexão: some ao fechar
foreign_key_checkLista as linhas que apontam para uma linha que não existePRAGMA foreign_key_check;Na Loja Aurora: nenhuma linha—
defer_foreign_keysDeixa a checagem das chaves para o COMMIT da transação atualPRAGMA defer_foreign_keys = ON;Lendo: 0A transação
integrity_checkConfere o banco inteiro (páginas, índices, NOT NULL…) e responde ok ou a lista de problemasPRAGMA integrity_check;okSó com arquivo faz sentido de verdade
quick_checkUma versão mais rápida do integrity_check (não confere se os índices batem com as tabelas)PRAGMA quick_check;okIdem

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.

PRAGMAO que fazExemploTerminal (loja.db)Fica no arquivo?
journal_modeComo o SQLite protege as gravações: delete (o padrão), wal, truncate, persist, memory, offPRAGMA journal_mode = WAL;deletewal fica; os outros, não
synchronousQuanto o SQLite espera o disco confirmar cada gravação: 0 OFF, 1 NORMAL, 2 FULL, 3 EXTRAPRAGMA synchronous = NORMAL;2Não (conexão)
page_sizeO tamanho de cada página do arquivo, em bytes. Só muda num banco vazio ou com VACUUMPRAGMA page_size;4096Sim
page_countQuantas páginas o arquivo temPRAGMA page_count;11—
freelist_countQuantas páginas estão vazias, esperando reaproveitamento (aula VACUUM e ANALYZE)PRAGMA freelist_count;0—
auto_vacuum0 NONE, 1 FULL, 2 INCREMENTAL: se o arquivo encolhe sozinho quando dados são apagadosPRAGMA auto_vacuum;0Sim
incremental_vacuumDevolve páginas vazias ao disco, no modo auto_vacuum = 2PRAGMA incremental_vacuum;(sem saída)—
user_versionUm número livre, gravado no arquivo, para o seu programa saber a versão do bancoPRAGMA user_version = 3;0Sim
application_idOutro número livre, para marcar o arquivo como "do seu aplicativo"PRAGMA application_id;0Sim
encodingA codificação dos textos do arquivoPRAGMA encoding;UTF-8 (no editor, só PRAGMA: ok)Sim
schema_versionUm contador que sobe a cada mudança de estrutura (CREATE, ALTER…). Só leia; nunca mude à mãoPRAGMA schema_version;7Sim
database_listOs bancos abertos na conexão e o arquivo de cada umPRAGMA database_list;0|main|/home/ana/loja.db—
wal_checkpointNo modo WAL, passa as gravações do arquivo -wal para o bancoPRAGMA 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

PRAGMAO que fazExemploSaída real (editor e terminal)
cache_sizeQuanta memória usar de cache. Número negativo = em KiB (−16384 = 16 MiB); positivo = em páginasPRAGMA cache_size;Editor -16384, terminal -2000
busy_timeoutQuantos milissegundos esperar quando outro programa está gravando no mesmo arquivo, antes de dar database is lockedPRAGMA busy_timeout = 5000;Lendo: 0 (a coluna se chama timeout)
temp_storeOnde guardar tabelas e índices temporários: 0 padrão, 1 arquivo, 2 memóriaPRAGMA temp_store = MEMORY;0
case_sensitive_likeFaz o LIKE diferenciar maiúsculas de minúsculas (aula LIKE). Só se muda; não dá para lerPRAGMA case_sensitive_like = ON;(sem saída)
recursive_triggersDeixa um gatilho disparar outros gatilhos em cadeiaPRAGMA recursive_triggers;0
query_onlyCom ON, a conexão só lê: qualquer INSERT, UPDATE ou DELETE dá attempt to write a readonly databasePRAGMA query_only = ON;Lendo: 0
ignore_check_constraintsCom ON, ignora os CHECK (aula CHECK). PerigosoPRAGMA ignore_check_constraints;0
automatic_indexDeixa o SQLite criar índices temporários sozinho para acelerar uma consultaPRAGMA automatic_index;1
trusted_schemaSe funções e tabelas virtuais podem ser usadas dentro de views e gatilhos guardados no arquivoPRAGMA trusted_schema;Editor 1, terminal 0
optimizeAtualiza 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).

PRAGMAO que listaEditorTerminal
compile_optionsAs opções com que o SQLite foi compilado55 linhas58 linhas
function_listTodas 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 linhas228 linhas
pragma_listTodos os PRAGMAs que existem64 linhas66 linhas
module_listOs módulos de tabela virtualinclui fts5, rtree, json_each, bytecode21 módulos: também generate_series, zipfile, fsdir, fts3/fts4; sem bytecode
collation_listAs regras de ordenação de textoRTRIM, NOCASE, BINARYtambé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

Nome errado: nenhum erro, nenhuma resposta

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.

Desligar as chaves dentro de uma transação
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 <

O 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.

no terminal.

Nos outros bancos

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 forma SELECT … 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_keys vale por conexão: ligado no editor, desligado em cada sqlite3 loja.db. foreign_key_check e integrity_check conferem o banco.
  • journal_mode, page_size, page_count, auto_vacuum, user_version: só fazem sentido com arquivo. user_version e o modo WAL ficam gravados nele.
  • Nome errado não dá erro: o PRAGMA é ignorado. Mudar foreign_keys dentro de uma transação também.
  • PRAGMA é só do SQLite; nos outros bancos, procure o INFORMATION_SCHEMA.