SQLite
 sql >> Teknologi Basis Data >  >> RDS >> SQLite

Temukan Pelanggaran Kunci Asing di SQLite

SQLite menyertakan pernyataan PRAGMA yang memungkinkan Anda memeriksa pelanggaran kunci asing di seluruh database atau tabel tertentu.

Pernyataannya adalah PRAGMA foreign_key_check , dan ini berfungsi sebagai berikut.

Sintaks

Anda dapat menggunakannya dengan salah satu dari dua cara:

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

Baris pertama memeriksa seluruh database, sedangkan baris kedua hanya memeriksa tabel tertentu.

schema opsional argumen menentukan nama database terlampir atau utama atau suhu untuk database utama dan TEMP. Jika schema dihilangkan, utama diasumsikan.

Contoh

Mari kita buat dua tabel dengan hubungan di antara mereka.

Dalam hal ini, Hewan Peliharaan tabel memiliki kunci asing yang mereferensikan TypeId kolom pada Jenis tabel.

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

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

Sekarang mari kita masukkan data yang melanggar batasan kunci asing.

PRAGMA foreign_keys = OFF;

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

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

INSERT kedua pernyataan melanggar batasan kunci asing. Ini karena memasukkan nilai 3 ke dalam Pets.TypeId kolom, ketika tidak ada nilai yang sesuai di Types.TypeId kolom.

Hal penting yang perlu diperhatikan di sini adalah saya secara eksplisit menonaktifkan kunci asing dengan menggunakan PRAGMA foreign_keys = OFF . Ini adalah pengaturan default di SQLite, tetapi saya ingin memperjelas contoh ini.

Sekarang mari kita periksa database untuk pelanggaran kunci asing.

PRAGMA foreign_key_check;

Hasil:

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

Ini memberitahu kita bahwa Hewan Peliharaan tabel memiliki pelanggaran kunci asing pada baris dengan ROWID 1. Ini juga memberi tahu kita nama tabel induk, serta ID kunci asing.

Mari tambahkan lebih banyak data ke Hewan Peliharaan tabel dan jalankan cek lagi. Dua baris pertama mematuhi kunci asing, tetapi baris terakhir tidak.

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

PRAGMA foreign_key_check;

Hasil:

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

Kami sekarang memiliki dua baris yang dikembalikan saat memeriksa seluruh database untuk pelanggaran kunci asing.

Periksa Tabel Tertentu

Anda juga dapat menentukan tabel untuk menjalankan pemeriksaan.

Berikut adalah contoh penulisan ulang cek sebelumnya untuk menentukan hanya Hewan Piaraan tabel.

PRAGMA foreign_key_check(Pets);

Hasil:

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

Hasil yang sama.

Inilah hasilnya jika saya menentukan tabel lainnya.

PRAGMA foreign_key_check(Types);

Hasil:

 

(Kosong karena tidak ada hasil.)

Tentukan Skema

Seperti yang disebutkan, Anda juga dapat menentukan skema.

PRAGMA main.foreign_key_check(Pets);

Hasil:

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

Dalam kasus saya, saya menggunakan database utama, tetapi Anda dapat mengganti main dengan nama database terlampir Anda.

Cara Menerapkan Kunci Asing

Seperti yang disebutkan, SQLite tidak menerapkan kunci asing kecuali Anda secara eksplisit menentukan bahwa kunci tersebut harus diterapkan.

Anda dapat menerapkan kunci asing menggunakan PRAGMA foreign_keys = ON .

Lihat Cara Mengaktifkan Dukungan Kunci Asing di SQLite untuk informasi dan contoh selengkapnya.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Gabung Dalam SQLite

  2. Pilih beberapa kolom dari dua tabel menggunakan greendao

  3. gabung di dua kolom tabel yang berbeda sqlite3

  4. Cara Membuat Operator LIKE SQLite Case-Sensitive

  5. Cara membuat database SQLite kosong