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.

  • ๐Ÿ”‘ Kunci utama: Kunci utama secara unik mengidentifikasi setiap baris, dan nilainya harus unik serta tidak pernah null.
  • ๐Ÿงฉ Kunci Komposit: Menggabungkan dua kolom atau lebih akan membentuk kunci utama komposit ketika tidak ada satu kolom pun yang unik.
  • ๐Ÿ”— Kunci asing: Kunci asing merujuk pada kunci tabel induk dan menegakkan integritas referensial antara tabel-tabel yang terkait.
  • โš™๏ธ Aktifkan Penegakan Hukum: SQLite Secara default, foreign key dinonaktifkan, jadi jalankan PRAGMA foreign_keys = ON untuk mengaktifkannya.
  • ๐Ÿงฑ Batasan Kolom: Aturan NOT NULL, DEFAULT, UNIQUE, dan CHECK memvalidasi nilai sebelum masuk ke dalam kolom.
  • ๐Ÿค– Bantuan AI: Asisten AI text-to-SQL dan GitHub Copilot menghasilkan SQL kunci dan batasan dari bahasa Inggris biasa.

Kunci Utama dan Kunci Asing di SQLite

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:

Hasil kueri SELECT yang menampilkan departemen TI dan Seni di SQLite

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.

SQLite Pesan kesalahan: Batasan KUNCI ASING 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.

Pertanyaan Umum Demo Slot

Ya. Ketika sebuah kolom dideklarasikan persis sebagai INTEGER PRIMARY KEY, kolom tersebut menjadi alias untuk rowid bawaan tabel. SQLite tidak menyimpan indeks terpisah untuk itu, sehingga pencarian berdasarkan kunci tersebut cepat dan tidak menggunakan penyimpanan tambahan.

Penegakan kunci asing tetap nonaktif secara default untuk menjaga kompatibilitas mundur dengan basis data dan skrip lama yang ditulis sebelum versi 3.6.19. Setiap koneksi basis data harus menjalankan PRAGMA foreign_keys = ON terlebih dahulu. SQLite mulai memeriksa batasan kunci asing.

SQLite Secara otomatis mengindeks primary key dan kolom UNIQUE, tetapi tidak mengindeks kolom foreign key. Karena kolom anak dibaca pada setiap pengecekan constraint, membuat indeks sendiri pada setiap kolom foreign key disarankan untuk meningkatkan performa.

Tidak. UBAH TABEL di SQLite Anda tidak dapat menambahkan kunci utama atau kunci asing ke tabel yang sudah ada. Anda mengganti nama tabel lama, membuat tabel baru dengan kunci yang telah ditentukan, menyalin baris dengan INSERT SELECT, lalu menghapus tabel lama.

Kunci utama bilangan bulat biasa menetapkan id berikutnya sebagai satu di atas rowid terbesar yang ada dan dapat menggunakan kembali id โ€‹โ€‹setelah penghapusan. AUTOINCREMENT tracks adalah id tertinggi yang pernah digunakan dalam sqlite_sequence dan tidak pernah menggunakan kembali nilai yang sama, dengan sedikit biaya kinerja.

Kesalahan ini muncul saat Anda menyisipkan atau memperbarui baris anak yang nilai kunci asingnya tidak memiliki baris yang cocok di tabel induk, atau saat Anda menghapus baris induk yang masih memiliki baris anak. Sisipkan data induk terlebih dahulu.

Ya. Asisten AI teks-ke-SQL mengubah deskripsi tabel Anda dalam bahasa Inggris biasa menjadi pernyataan CREATE TABLE dengan klausa PRIMARY KEY dan FOREIGN KEY. Menyediakan skema yang ada meningkatkan akurasi, dan SQL yang dihasilkan harus selalu ditinjau sebelum dijalankan pada data nyata.

Ya. Kopilot GitHub menyarankan kode CREATE TABLE dengan PRIMARY KEY, FOREIGN KEY, dan batasan lainnya yang disisipkan langsung di editor seperti VS Code. Fitur ini membaca skema dan migrasi yang sudah ada, sehingga penyelesaian otomatisnya menggunakan kembali nama tabel dan kolom asli Anda.

Ringkaslah postingan ini dengan: