Kunci Utama dan Kunci Asing di SQLite dengan Contoh
โก Ringkasan Cerdas
Kunci utama dan kunci asing dalam SQLite Menegakkan integritas data dengan mengidentifikasi setiap baris secara unik dan menghubungkan tabel terkait, memastikan bahwa nilai yang dirujuk selalu ada dan mencegah duplikasi, nilai null, atau catatan yatim piatu di seluruh basis data relasional.

Bagian-bagian di bawah ini menjelaskan SQLite Penjelasan rinci mengenai batasan, dimulai dari PRIMARY KEY dan FOREIGN KEY yang mendefinisikan dan menghubungkan tabel, serta mencakup aturan NOT NULL, DEFAULT, UNIQUE, dan CHECK yang memvalidasi data di setiap kolom.
SQLite kendala
Batasan kolom memberlakukan aturan pada nilai yang dimasukkan ke dalam kolom untuk memvalidasi data. Batasan ini didefinisikan saat membuat tabel, di dalam definisi kolom. Batasan ini menjaga agar data yang tersimpan tetap konsisten dan akurat dengan menolak nilai yang melanggar aturan yang Anda tetapkan, seperti duplikat, nilai null, atau nilai yang tidak ada di tabel terkait.
SQLite Kunci utama
Semua nilai dalam kolom kunci utama harus unik dan tidak boleh null. Kunci utama secara unik mengidentifikasi setiap baris dalam tabel.
Kunci utama dapat diterapkan hanya pada satu kolom atau pada kombinasi kolom. Dalam kasus terakhir, kombinasi nilai kolom harus unik untuk semua baris tabel.
sintaks:
Ada beberapa cara berbeda untuk mendefinisikan kunci utama pada sebuah tabel:
Di kolom definisi itu sendiri:
ColumnName INTEGER NOT NULL PRIMARY KEY;
Sebagai definisi tersendiri:
PRIMARY KEY(ColumnName);
Untuk membuat kombinasi kolom sebagai kunci utama:
PRIMARY KEY(ColumnName1, ColumnName2);
SQLite Batasan NOT NULL, DEFAULT, UNIQUE, dan CHECK
Selain kunci utama, SQLite menyediakan beberapa batasan kolom yang memvalidasi nilai yang dimasukkan ke dalam tabel. Batasan NOT NULL, DEFAULT, UNIQUE, dan CHECK masing-masing didefinisikan dalam definisi kolom, dan setiap batasan tersebut memberlakukan aturan spesifik pada kolom tersebut. tipe data dan nilai-nilai.
Batasan TIDAK NULL
The SQLite Batasan NOT NULL mencegah sebuah kolom memiliki nilai null:
ColumnName INTEGER NOT NULL;
Batasan DEFAULT
Dengan SQLite Batasan DEFAULT, jika Anda tidak memasukkan nilai apa pun ke dalam kolom, nilai default akan dimasukkan sebagai gantinya.
Sebagai contoh:
ColumnName INTEGER DEFAULT 0;
Jika Anda menulis pernyataan insert dan Anda tidak menentukan nilai apa pun untuk kolom tersebut, kolom tersebut akan memiliki nilai 0.
Batasan UNIK
The SQLite Batasan UNIQUE mencegah nilai duplikat di antara semua nilai dalam kolom tersebut.
Sebagai contoh:
EmployeeId INTEGER NOT NULL UNIQUE;
Ini memastikan bahwa nilai โEmployeeIdโ harus unik; tidak diperbolehkan adanya nilai duplikat. Perhatikan bahwa ini hanya berlaku untuk nilai kolom โEmployeeIdโ.
Batasan PERIKSA
The SQLite Batasan CHECK menetapkan kondisi untuk memeriksa nilai yang dimasukkan. Jika nilai tersebut tidak sesuai dengan kondisi, nilai tersebut tidak akan dimasukkan.
Quantity INTEGER NOT NULL CHECK(Quantity > 10);
Anda tidak dapat memasukkan nilai kurang dari 10 di kolom โKuantitasโ.
SQLite Kunci asing
The SQLite Foreign key adalah sebuah batasan yang memverifikasi keberadaan suatu nilai yang ada dalam satu tabel di tabel lain yang memiliki relasi dengan tabel pertama tempat foreign key tersebut didefinisikan.
Saat bekerja dengan banyak tabel, ada kasus di mana dua tabel saling berhubungan melalui satu kolom yang sama. Jika Anda ingin memastikan bahwa nilai yang dimasukkan di salah satu tabel harus ada di kolom tabel lainnya, maka Anda harus menggunakan batasan kunci asing (foreign key constraint) pada kolom yang sama tersebut.
Dalam hal ini, ketika Anda mencoba memasukkan nilai ke dalam kolom tersebut, kunci asing akan memastikan bahwa nilai yang dimasukkan tersebut ada di kolom tabel yang dirujuk.
Perlu dicatat bahwa batasan kunci asing tidak diaktifkan secara default di SQLiteAnda harus mengaktifkannya terlebih dahulu dengan menjalankan perintah berikut:
PRAGMA foreign_keys = ON;
Batasan kunci asing diperkenalkan pada tahun 2017 SQLite mulai dari versi 3.6.19.
Contoh SQLite Kunci asing
Misalkan kita memiliki dua tabel: Mahasiswa dan Departemen.
Tabel Mahasiswa berisi daftar mahasiswa, dan tabel Departemen berisi daftar departemen. Setiap mahasiswa tergabung dalam suatu departemen; artinya, setiap mahasiswa memiliki kolom departmentId.
Sekarang kita akan melihat bagaimana batasan kunci asing dapat membantu memastikan bahwa nilai id departemen di tabel Mahasiswa harus ada di tabel Departemen.
Jadi, jika kita membuat batasan kunci asing pada DepartmentId di tabel Students, setiap departmentId yang dimasukkan harus ada di tabel Departments.
CREATE TABLE [Departments] ( [DepartmentId] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, [DepartmentName] NVARCHAR(50) NULL ); CREATE TABLE [Students] ( [StudentId] INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, [StudentName] NVARCHAR(50) NULL, [DepartmentId] INTEGER NOT NULL, [DateOfBirth] DATE NULL, FOREIGN KEY(DepartmentId) REFERENCES Departments(DepartmentId) );
Untuk memeriksa bagaimana batasan kunci asing dapat mencegah elemen atau nilai yang tidak terdefinisi dimasukkan ke dalam tabel yang memiliki relasi dengan tabel lain, kita akan melihat contoh berikut.
Dalam contoh ini, tabel Departemen memiliki relasi kunci asing ke tabel Mahasiswa, sehingga setiap nilai departmentId yang dimasukkan ke dalam tabel Mahasiswa harus ada di tabel Departemen. Jika Anda mencoba memasukkan nilai departmentId yang tidak ada di tabel Departemen, batasan kunci asing akan mencegah Anda melakukannya.
Mari kita masukkan dua departemen, โTIโ dan โSeniโ, ke dalam tabel Departemen dengan data sebagai berikut: Kueri INSERT:
INSERT INTO Departments VALUES(1, 'IT'); INSERT INTO Departments VALUES(2, 'Arts');
Kedua pernyataan tersebut seharusnya memasukkan dua departemen ke dalam tabel Departemen. Anda dapat memastikan bahwa kedua nilai tersebut telah dimasukkan dengan menjalankan kueri โSELECT * FROM Departmentsโ setelahnya:
Kemudian coba masukkan siswa baru dengan departmentId yang tidak ada di tabel Departemen:
INSERT INTO Students(StudentName,DepartmentId) VALUES('John', 5);
Baris tersebut tidak akan disisipkan, dan Anda akan mendapatkan kesalahan yang menyatakan: Batasan FOREIGN KEY gagal.
Perbedaan Antara Primary Key dan Foreign Key SQLite
Kunci utama dan kunci asing sama-sama membantu menjaga integritas data, tetapi keduanya memiliki peran yang berbeda. Kunci utama mengidentifikasi baris dalam satu tabel, sedangkan kunci asing menghubungkan baris di dua tabel yang saling terkait. Tabel di bawah ini merangkum perbedaan utama tersebut.
| Dasar | Kunci utama | Kunci asing |
|---|---|---|
| Tujuan | Mengidentifikasi secara unik setiap baris dalam tabelnya masing-masing. | Mengacu pada kunci utama tabel lain untuk menghubungkannya. |
| Keunikan | Nilai harus unik. | Nilai dapat berulang, sehingga banyak baris anak dapat memiliki satu induk yang sama. |
| Nilai nol | Tidak boleh null | Bisa bernilai null jika relasi bersifat opsional. |
| Jumlah per meja | Hanya satu kunci utama per tabel. | Sebuah tabel dapat memiliki beberapa kunci asing. |
| Pengindeksan | Diindeks secara otomatis | Tidak diindeks secara otomatis; tambahkan satu untuk meningkatkan kinerja. |
Dalam contoh Mahasiswa dan Departemen, DepartmentId adalah kunci utama dari tabel Departemen dan kunci asing di tabel Mahasiswa, yang menghubungkan setiap mahasiswa dengan departemen yang valid.
SQLite Kunci Utama Komposit
Kunci utama komposit adalah kunci utama yang terdiri dari dua kolom atau lebih. Kunci ini digunakan ketika tidak ada satu kolom pun yang unik secara sendiri-sendiri, tetapi kombinasi kolom-kolom tersebut unik untuk setiap baris. SQLite memperlakukan nilai gabungan sebagai satu kunci.
Sebagai contoh, tabel pendaftaran mungkin memperbolehkan siswa yang sama mengikuti banyak mata kuliah dan mata kuliah yang sama untuk banyak siswa, namun setiap pasangan siswa-mata kuliah hanya boleh muncul sekali:
CREATE TABLE Enrollments ( StudentId INTEGER NOT NULL, CourseId INTEGER NOT NULL, Grade TEXT, PRIMARY KEY (StudentId, CourseId) );
Di sini, baik StudentId maupun CourseId tidak unik secara sendiri-sendiri, tetapi pasangan (StudentId, CourseId) bersifat unik, sehingga siswa yang sama tidak dapat terdaftar di kursus yang sama dua kali. Perhatikan poin-poin berikut saat Anda menggunakan kunci komposit:
- Gunakan kunci komposit ketika satu kolom saja tidak dapat mengidentifikasi baris secara unik.
- Setiap kolom dalam kunci komposit mengikuti aturan kunci utama, sehingga nilai gabungan harus unik dan tidak boleh null.
- Kunci komposit ditulis sebagai klausa PRIMARY KEY tingkat tabel yang terpisah, bukan di dalam definisi kolom tunggal.
SQLite Aksi Kunci Asing: ON DELETE dan ON UPDATE
Kunci asing juga dapat mengontrol apa yang terjadi pada baris anak ketika baris induk yang dirujuknya dihapus atau diperbarui. Tindakan referensial ini ditambahkan dengan klausa ON DELETE dan ON UPDATE saat Anda mendefinisikan kunci asing. SQLite mendukung lima tindakan:
- TIDAK ADA TINDAKAN โ tindakan default, yang akan menimbulkan kesalahan jika baris anak masih merujuk ke induknya.
- MEMBATASI โ mencegah penghapusan atau pembaruan secara langsung, sebelum perubahan lain dijalankan.
- TETAPKAN BATAL โ mengatur kolom kunci asing anak menjadi null.
- SET STANDAR โ mengatur kolom kunci asing anak ke nilai default yang telah dideklarasikan.
- RIAM โ menerapkan perubahan yang sama pada baris anak, jadi menghapus induk akan menghapus anak-anaknya.
Contoh di bawah ini membuat ulang tabel Mahasiswa sehingga menghapus departemen secara otomatis menghapus mahasiswanya, dan memperbarui ID departemen akan memperbarui mahasiswa yang sesuai:
CREATE TABLE Students ( StudentId INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, StudentName NVARCHAR(50) NULL, DepartmentId INTEGER NOT NULL, FOREIGN KEY(DepartmentId) REFERENCES Departments(DepartmentId) ON DELETE CASCADE ON UPDATE CASCADE );
Ingat bahwa tindakan referensial hanya berjalan ketika dukungan kunci asing diaktifkan, jadi jalankan PRAGMA foreign_keys = ON di awal setiap koneksi. Tanpa itu, SQLite Menganalisis klausa ON DELETE dan ON UPDATE tetapi tidak memberlakukannya.


