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

Cara Menjatuhkan Kunci Asing di SQLite

Biasanya jika Anda perlu menjatuhkan kunci asing di SQL, Anda akan menggunakan ALTER TABLE penyataan. Tetapi jika Anda menggunakan SQLite, itu bukan pilihan.

SQLite mendukung subset yang sangat terbatas dari ALTER TABLE penyataan. Satu-satunya hal yang dapat Anda lakukan dengan ALTER TABLE di SQLite adalah mengganti nama tabel, mengganti nama kolom di dalam tabel, atau menambahkan kolom baru ke tabel yang sudah ada.

Dengan kata lain, Anda tidak dapat menggunakan ALTER TABLE untuk menjatuhkan kunci asing seperti yang Anda bisa di RDBMS lain

Cara yang disarankan untuk "menjatuhkan" kunci asing di SQLite sebenarnya adalah dengan mentransfer data ke tabel baru tanpa kunci asing (atau dengan kunci asing yang berbeda, jika itu yang Anda perlukan).

Cara yang Disarankan

Dokumentasi SQLite merekomendasikan proses 12 langkah untuk membuat perubahan skema ke tabel. Kami akan menggunakan proses itu untuk "menjatuhkan" kunci asing dalam contoh berikut.

Membuat Tabel dengan Kunci Asing

Pertama, mari buat tabel dengan kunci asing dan isi dengan data.

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

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

INSERT INTO Types VALUES 
    ( NULL, 'Dog' ),
    ( NULL, 'Cat' ),
    ( NULL, 'Parakeet' ),
    ( NULL, 'Hamster' );

INSERT INTO Pets VALUES 
    ( NULL, 'Brush', 3 ),
    ( NULL, 'Tweet', 3 ),
    ( NULL, 'Yelp', 1 ),
    ( NULL, 'Woofer', 1 ),
    ( NULL, 'Fluff', 2 );

Sebenarnya, di sini saya membuat dua tabel dan mengisinya dengan data. Dua tabel, karena yang pertama (Jenis ) memiliki kunci utama dan yang lainnya (Hewan peliharaan ) memiliki kunci asing. Kunci asing ditambahkan pada baris terakhir dari tabel kedua.

Kami dapat memverifikasi bahwa kunci asing telah dibuat dengan menjalankan perintah berikut:

PRAGMA foreign_key_list(Pets);

Hasil:

 id  seq  table  from    to      on_update  on_delete  match
 --  ---  -----  ------  ------  ---------  ---------  -----
 0   0    Types  TypeId  TypeId  NO ACTION  NO ACTION  NONE  

Kita dapat melihat detail batasan kunci asing.

Sekarang mari kita "lepaskan" kunci asing.

“Lepaskan” Kunci Asing

Kode berikut “menjatuhkan” kunci asing dengan membuat tabel baru tanpa batasan kunci asing, mentransfer data ke tabel tersebut, menghapus tabel asli, lalu mengganti nama tabel baru dengan nama tabel asli.

PRAGMA foreign_keys = OFF;

BEGIN TRANSACTION;

CREATE TABLE Pets_new( 
    PetId INTEGER PRIMARY KEY, 
    PetName,
    TypeId
);

INSERT INTO Pets_new SELECT * FROM Pets;

DROP TABLE Pets;

ALTER TABLE Pets_new RENAME TO Pets;

COMMIT;

PRAGMA foreign_keys = ON;

Selesai.

Jika Anda perlu merekonstruksi indeks, pemicu, atau tampilan apa pun, lakukan setelah ALTER TABLE pernyataan yang mengganti nama tabel (tepat sebelum COMMIT ).

Sekarang mari kita periksa tabel untuk batasan kunci asing lagi.

PRAGMA foreign_key_list(Pets);

Hasil:

 

(Itu kosong karena tidak ada batasan kunci asing di tabel ini.)

Anda dapat menggunakan metode yang sama untuk menambahkan kunci asing ke tabel yang ada.

Metode Alternatif

Saat melihat contoh sebelumnya, Anda mungkin berpikir bahwa ada cara yang lebih efisien untuk melakukannya. Misalnya Anda bisa melakukannya seperti ini:

PRAGMA foreign_keys = OFF;

BEGIN TRANSACTION;

ALTER TABLE Pets RENAME TO Pets_old;

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

INSERT INTO Pets SELECT * FROM Pets_old;

DROP TABLE Pets_old;

COMMIT;

PRAGMA foreign_keys = ON;

Dan itu benar. Dengan contoh saya, metode ini bekerja dengan baik.

Namun metode ini juga berpotensi merusak referensi ke tabel di pemicu, tampilan, dan batasan kunci asing yang ada.

Jadi, jika tabel Anda sudah memiliki pemicu, tampilan, atau batasan kunci asing, mungkin lebih aman menggunakan metode yang disarankan.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pustaka ruang dapat menyalin db dari folder aset?

  2. Logcat mengatakan data kolom tidak valid1

  3. Tambahkan Hari ke Tanggal di SQLite

  4. Masalah dengan SQLiteOpenHelper di android 2.X dan 3.X

  5. Urutan SQLite Berdasarkan Tanggal1530019888000