SQLite
 sql >> база данни >  >> RDS >> SQLite

Намерете нарушения на външния ключ в SQLite

SQLite включва изявление PRAGMA, което ви позволява да проверявате за нарушения на външни ключове в цяла база данни или дадена таблица.

Изявлението е PRAGMA foreign_key_check , и работи по следния начин.

Синтаксис

Можете да го използвате по един от двата начина:

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

Първият ред проверява цялата база данни, докато вторият проверява само конкретна таблица.

Незадължителната schema аргументът указва името на прикачена база данни или основна или темпер. за основната и ТЕЛК бази данни. Ако schema е пропуснат,главен се предполага.

Пример

Нека създадем две таблици с връзка между тях.

В този случай Домашни любимци таблицата има външен ключ, който препраща към TypeId колона в Типове таблица.

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

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

Сега нека въведете данни, които нарушават ограничението за външния ключ.

PRAGMA foreign_keys = OFF;

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

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

Вторият INSERT изявлението нарушава ограничението за външния ключ. Това е така, защото вмъква стойност 3 в Pets.TypeId колона, когато няма съответна стойност в Types.TypeId колона.

Важно нещо, което трябва да се отбележи тук, е, че изрично деактивирах външните ключове, като използвах PRAGMA foreign_keys = OFF . Това е настройката по подразбиране в SQLite, но исках да уточня за този пример.

Сега нека проверим базата данни за нарушения на външния ключ.

PRAGMA foreign_key_check;

Резултат:

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

Това ни казва, че Домашни любимци таблицата има нарушение на външния ключ на реда с ROWID от 1. Също така ни казва името на родителската таблица, както и идентификатора на външния ключ.

Нека добавим още данни към Домашни любимци таблица и изпълнете проверката отново. Първите два реда се придържат към външния ключ, но последният ред не.

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

PRAGMA foreign_key_check;

Резултат:

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

Вече имаме два реда, върнати при проверка на цялата база данни за нарушения на външния ключ.

Проверете конкретна таблица

Можете също да посочите таблица, срещу която да стартирате проверката.

Ето пример за пренаписване на предишната проверка, за да посочите само Домашни любимци таблица.

PRAGMA foreign_key_check(Pets);

Резултат:

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

Същият резултат.

Ето резултата, ако посоча другата таблица.

PRAGMA foreign_key_check(Types);

Резултат:

 

(Празно е, защото няма резултати.)

Посочете схема

Както споменахме, можете също да посочите схемата.

PRAGMA main.foreign_key_check(Pets);

Резултат:

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

В моя случай използвах основната база данни, но можете да замените main с името на вашата прикачена база данни.

Как да наложите външни ключове

Както споменахме, SQLite не налага външни ключове, освен ако не посочите изрично, че те трябва да бъдат наложени.

Можете да приложите външни ключове, като използвате PRAGMA foreign_keys = ON .

Вижте Как да активирате поддръжката на външни ключове в SQLite за повече информация и примери.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Променено ли е поведението на Android SQLite Journal?

  2. Добавете дни към дата в SQLite

  3. Връщане на масив от низове и го използвайте в AutoCompleteTextview

  4. Експортирайте резултатите от SQLite заявка в CSV файл

  5. Как да създадете приложение за офлайн интернационализация:Изградете структурата на проекта