sql >> Databáze >  >> RDS >> SQLite

Najděte porušení cizího klíče v SQLite

SQLite obsahuje příkaz PRAGMA, který vám umožňuje zkontrolovat porušení cizího klíče v celé databázi nebo dané tabulce.

Příkaz je PRAGMA foreign_key_check a funguje následovně.

Syntaxe

Můžete jej použít jedním ze dvou způsobů:

PRAGMA schema.foreign_key_check;
PRAGMA schema.foreign_key_check(table-name);

První řádek kontroluje celou databázi, zatímco druhý kontroluje pouze konkrétní tabulku.

Volitelné schema argument určuje název připojené databáze nebo hlavní nebo teplota pro hlavní a TEMP databáze. Pokud schema je vynecháno, hlavní se předpokládá.

Příklad

Vytvořme dvě tabulky se vztahem mezi nimi.

V tomto případě Zvířata tabulka má cizí klíč, který odkazuje na TypId ve sloupci Typy tabulka.

CREATE TABLE Types( 
    TypeId INTEGER PRIMARY KEY, 
    Type
);

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

Nyní zadáme data, která porušují omezení cizího klíče.

PRAGMA foreign_keys = OFF;

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

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

Druhý INSERT příkaz porušuje omezení cizího klíče. Je to proto, že do Pets.TypeId vloží hodnotu 3 ve sloupci Typy.TypeId sloupec.

Zde je důležité poznamenat, že jsem výslovně zakázal cizí klíče pomocí PRAGMA foreign_keys = OFF . Toto je výchozí nastavení v SQLite, ale chtěl jsem to v tomto příkladu objasnit.

Nyní zkontrolujeme databázi, zda nedošlo k porušení cizího klíče.

PRAGMA foreign_key_check;

Výsledek:

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

To nám říká, že Zvířata tabulka má porušení cizího klíče na řádku s ROWID 1. Také nám sděluje název nadřazené tabulky a také ID cizího klíče.

Pojďme přidat další data do Zvířatů tabulky a znovu spusťte kontrolu. První dva řádky se drží cizího klíče, ale poslední ne.

INSERT INTO Pets VALUES 
    ( NULL, 'Yelp', 1 ),
    ( NULL, 'Fluff', 2 ),
    ( NULL, 'Brush', 4 );

PRAGMA foreign_key_check;

Výsledek:

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

Nyní máme dva řádky vrácené při kontrole celé databáze na porušení cizího klíče.

Zkontrolujte konkrétní tabulku

Můžete také zadat tabulku, proti které se má kontrola spustit.

Zde je příklad přepsání předchozího šeku tak, aby specifikoval pouze Zvířata tabulka.

PRAGMA foreign_key_check(Pets);

Výsledek:

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

Stejný výsledek.

Zde je výsledek, pokud specifikuji druhou tabulku.

PRAGMA foreign_key_check(Types);

Výsledek:

 

(Je prázdné, protože neexistují žádné výsledky.)

Zadejte schéma

Jak již bylo zmíněno, můžete také určit schéma.

PRAGMA main.foreign_key_check(Pets);

Výsledek:

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

V mém případě jsem použil hlavní databázi, ale můžete nahradit main s názvem vaší připojené databáze.

Jak vynutit cizí klíče

Jak bylo zmíněno, SQLite nevynucuje cizí klíče, pokud výslovně neurčíte, že by měly být vynuceny.

Cizí klíče můžete vynutit pomocí PRAGMA foreign_keys = ON .

Další informace a příklady najdete v části Jak povolit podporu cizích klíčů v SQLite.


  1. psql klient může být nyní šachovnicí…

  2. Proč mi Oracle DECODE dává jinou hodnotu než NVL?

  3. Režie sledování vytváření #temp tabulky

  4. SQL Naplnění tabulky náhodnými daty