sql >> Database teknologi >  >> RDS >> SQLite

Find overtrædelser af fremmednøgler i SQLite

SQLite indeholder en PRAGMA-sætning, der giver dig mulighed for at tjekke for fremmednøglebrud på en hel database eller en given tabel.

Udsagnet er PRAGMA foreign_key_check , og det fungerer som følger.

Syntaks

Du kan bruge det på en af ​​to måder:

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

Den første linje tjekker hele databasen, mens den anden kun tjekker en bestemt tabel.

Det valgfrie schema argument angiver navnet på en vedhæftet database eller main eller temp for hoved- og TEMP-databaserne. Hvis schema er udeladt, main er antaget.

Eksempel

Lad os oprette to tabeller med et forhold mellem dem.

I dette tilfælde er Kæledyr tabellen har en fremmednøgle, der refererer til TypeId kolonne på Typer tabel.

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

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

Lad os nu indtaste data, der overtræder begrænsningen for fremmednøgle.

PRAGMA foreign_keys = OFF;

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

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

Den anden INSERT erklæringen overtræder begrænsningen for fremmednøgle. Dette skyldes, at den indsætter en værdi på 3 i Pets.TypeId kolonne, når der ikke er en tilsvarende værdi i Types.TypeId kolonne.

En vigtig ting at bemærke her er, at jeg eksplicit deaktiverede fremmednøgler ved at bruge PRAGMA foreign_keys = OFF . Dette er standardindstillingen i SQLite, men jeg ønskede at gøre det klart for dette eksempel.

Lad os nu tjekke databasen for krænkelser af fremmednøgler.

PRAGMA foreign_key_check;

Resultat:

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

Dette fortæller os, at Kæledyr tabellen har en overtrædelse af en fremmednøgle på rækken med en ROWID på 1. Den fortæller os også navnet på den overordnede tabel samt fremmednøgle-id'et.

Lad os tilføje flere data til Kæledyr bordet og kør kontrollen igen. De første to linjer klæber til fremmednøglen, men den sidste linje gør det ikke.

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

PRAGMA foreign_key_check;

Resultat:

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

Vi har nu returneret to rækker, når vi tjekker hele databasen for krænkelser af fremmednøgler.

Tjek en specifik tabel

Du kan også angive en tabel at køre checken imod.

Her er et eksempel på omskrivning af den forrige kontrol for kun at angive kæledyrene tabel.

PRAGMA foreign_key_check(Pets);

Resultat:

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

Samme resultat.

Her er resultatet, hvis jeg angiver den anden tabel.

PRAGMA foreign_key_check(Types);

Resultat:

 

(Den er tom, fordi der ikke er nogen resultater.)

Angiv et skema

Som nævnt kan du også angive skemaet.

PRAGMA main.foreign_key_check(Pets);

Resultat:

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

I mit tilfælde brugte jeg hoveddatabasen, men du kunne erstatte main med navnet på din vedhæftede database.

Sådan håndhæves fremmednøgler

Som nævnt håndhæver SQLite ikke fremmednøgler, medmindre du udtrykkeligt angiver, at de skal håndhæves.

Du kan gennemtvinge fremmednøgler ved at bruge PRAGMA foreign_keys = ON .

Se Sådan aktiverer du understøttelse af fremmed nøgle i SQLite for mere information og eksempler.


  1. PHP CRUD Opret, rediger, opdater og slet indlæg med MySQL-database

  2. Sådan får du vist forespørgselsudførelsesplanen i Azure Data Studio (SQL-server)

  3. Hvordan kan jeg indstille et tilpasset dato-tidsformat i Oracle SQL Developer?

  4. Rekursion på databaseforespørgsel for at få hierarkiske resultater ved hjælp af Hibernate - Java