No SQLite, as restrições de chave estrangeira não são impostas, a menos que o suporte a chave estrangeira tenha sido habilitado.
A habilitação de chaves estrangeiras envolve o seguinte:
- Ative chaves estrangeiras ao compilar SQLite.
- Ative chaves estrangeiras em tempo de execução.
Ativar chaves estrangeiras ao compilar SQLite
Quando se trata de compilar SQLite, não é tanto uma questão de habilitar chaves estrangeiras – é mais uma questão de não desabilitar eles.
Habilitar chaves estrangeiras ao compilar SQLite significa simplesmente que você não usa
SQLITE_OMIT_FOREIGN_KEY
e SQLITE_OMIT_TRIGGER
ao compilá-lo. Se
SQLITE_OMIT_TRIGGER
está definido, mas SQLITE_OMIT_FOREIGN_KEY
não é, então as definições de chave estrangeira são analisadas e podem ser consultadas usando PRAGMA foreign_key_list
, mas as restrições de chave estrangeira não são aplicadas. As PRAGMA foreign_keys
O comando é um no-op nesta configuração. Se
OMIT_FOREIGN_KEY
for definida, as definições de chave estrangeira não poderão ser analisadas (tentar especificar uma definição de chave estrangeira é um erro de sintaxe). Ativar chaves estrangeiras em tempo de execução
Mesmo quando a biblioteca foi compilada com restrições de chave estrangeira habilitadas, você ainda precisa habilitar o suporte a chave estrangeira em tempo de execução.
Você pode fazer isso com o seguinte código:
PRAGMA foreign_keys = ON;
Como na maioria dos
PRAGMA
instruções, você pode substituir alternativamente ON
com TRUE
, YES
, ou 1
. Depois de executar isso, suas chaves estrangeiras serão aplicadas.
Observe que essa configuração não é necessária para criar chaves estrangeiras, mas é necessário para aplicar chaves estrangeiras.
Outras conexões
Observe que isso só habilita restrições de chave estrangeira para a conexão de banco de dados atual.
Se você abrir uma nova conexão, precisará executar essa instrução novamente se quiser que as chaves estrangeiras sejam impostas nessa conexão.
Verifique o suporte de chave estrangeira para a conexão atual
Você também pode verificar se as chaves estrangeiras já foram habilitadas para sua conexão atual executando o código a seguir.
PRAGMA foreign_keys;
Resultado:
1
No meu caso, eu já habilitei chaves estrangeiras para esta conexão, então o resultado é 1. Se as chaves estrangeiras estivessem desabilitadas, o resultado seria 0.
Aqui está um exemplo de desabilitação, verificação do valor e, em seguida, habilitar e verificar novamente o valor.
PRAGMA foreign_keys = FALSE;
PRAGMA foreign_keys;
PRAGMA foreign_keys = YES;
PRAGMA foreign_keys;
Resultado:
sqlite> PRAGMA foreign_keys = FALSE; sqlite> PRAGMA foreign_keys; foreign_keys ------------ 0 sqlite> PRAGMA foreign_keys = YES; sqlite> PRAGMA foreign_keys; foreign_keys ------------ 1