SQLite
 sql >> Base de Dados >  >> RDS >> SQLite

Encontrar violações de chave estrangeira no SQLite


O SQLite inclui uma instrução PRAGMA que permite verificar violações de chave estrangeira em um banco de dados inteiro ou em uma determinada tabela.

A instrução é PRAGMA foreign_key_check , e funciona da seguinte forma.

Sintaxe


Você pode usá-lo de duas maneiras:
PRAGMA schema.foreign_key_check;
PRAGMA schema.foreign_key_check(table-name);

A primeira linha verifica todo o banco de dados, enquanto a segunda verifica apenas uma tabela específica.

O schema opcional argumento especifica o nome de um banco de dados anexado ou principal ou temperatura para os bancos de dados principal e TEMP. Se schema é omitido, principal é assumido.

Exemplo


Vamos criar duas tabelas com um relacionamento entre elas.

Nesse caso, os Animais de estimação tabela tem uma chave estrangeira que faz referência ao TypeId coluna nos Tipos tabela.
CREATE TABLE Types( 
    TypeId INTEGER PRIMARY KEY, 
    Type
);

CREATE TABLE Pets( 
    PetId INTEGER PRIMARY KEY, 
    PetName,
    TypeId,
    FOREIGN KEY(TypeId) REFERENCES Types(TypeId)
);

Agora vamos inserir dados que violam a restrição de chave estrangeira.
PRAGMA foreign_keys = OFF;

INSERT INTO Types VALUES 
    ( 1, 'Dog' ),
    ( 2, 'Cat' );

INSERT INTO Pets VALUES 
    ( 1, 'Homer', 3 );

O segundo INSERT declaração viola a restrição de chave estrangeira. Isso ocorre porque ele insere um valor de 3 no Pets.TypeId coluna, quando não houver um valor correspondente em Types.TypeId coluna.

Uma coisa importante a ser observada aqui é que eu desativei explicitamente as chaves estrangeiras usando PRAGMA foreign_keys = OFF . Esta é a configuração padrão no SQLite, mas eu queria deixar claro para este exemplo.

Agora vamos verificar o banco de dados para violações de chave estrangeira.
PRAGMA foreign_key_check;

Resultado:
table       rowid       parent      fkid      
----------  ----------  ----------  ----------
Pets        1           Types       0         

Isso nos diz que os Animais de estimação table tem uma violação de chave estrangeira na linha com ROWID de 1. Ela também nos informa o nome da tabela pai, bem como o ID da chave estrangeira.

Vamos adicionar mais dados aos Animais de estimação tabela e execute a verificação novamente. As duas primeiras linhas aderem à chave estrangeira, mas a última linha não.
INSERT INTO Pets VALUES 
    ( NULL, 'Yelp', 1 ),
    ( NULL, 'Fluff', 2 ),
    ( NULL, 'Brush', 4 );

PRAGMA foreign_key_check;

Resultado:
table       rowid       parent      fkid      
----------  ----------  ----------  ----------
Pets        1           Types       0         
Pets        4           Types       0         

Agora temos duas linhas retornadas ao verificar todo o banco de dados em busca de violações de chave estrangeira.

Verifique uma tabela específica


Você também pode especificar uma tabela para executar a verificação.

Aqui está um exemplo de reescrita da verificação anterior para especificar apenas os Animais de estimação tabela.
PRAGMA foreign_key_check(Pets);

Resultado:
table       rowid       parent      fkid      
----------  ----------  ----------  ----------
Pets        1           Types       0         
Pets        4           Types       0         

Mesmo resultado.

Aqui está o resultado se eu especificar a outra tabela.
PRAGMA foreign_key_check(Types);

Resultado:
 
(Está em branco porque não há resultados.)

Especificar um esquema


Conforme mencionado, você também pode especificar o esquema.
PRAGMA main.foreign_key_check(Pets);

Resultado:
table       rowid       parent      fkid      
----------  ----------  ----------  ----------
Pets        1           Types       0         
Pets        4           Types       0         

No meu caso eu usei o banco de dados principal, mas você poderia substituir main com o nome de seu banco de dados anexado.

Como aplicar chaves estrangeiras


Como mencionado, o SQLite não impõe chaves estrangeiras, a menos que você especifique explicitamente que elas devem ser aplicadas.

Você pode impor chaves estrangeiras usando PRAGMA foreign_keys = ON .

Consulte Como habilitar o suporte a chave estrangeira no SQLite para obter mais informações e exemplos.