Ringkasan :dalam tutorial ini, Anda akan belajar tentang SQLite AUTOINCREMENT
atribut kolom dan kapan menggunakannya di tabel Anda.
Pengantar SQLite ROWID
tabel
Setiap kali Anda membuat tabel tanpa menentukan WITHOUT ROWID
opsi, Anda mendapatkan kolom kenaikan otomatis implisit yang disebut rowid
. rowid
kolom menyimpan bilangan bulat bertanda 64-bit yang secara unik mengidentifikasi baris dalam tabel.
Mari kita lihat contoh berikut.
Pertama, buat tabel baru bernama people
yang memiliki dua kolom:first_name,
dan last_name
:
CREATE TABLE people (
first_name TEXT NOT NULL,
last_name TEXT NOT NULL
);
Code language: SQL (Structured Query Language) (sql)
Cobalah
Kedua, masukkan baris ke dalam people
tabel menggunakan INSERT
berikut ini pernyataan:
INSERT INTO people (first_name, last_name)
VALUES('John', 'Doe');
Code language: SQL (Structured Query Language) (sql)
Cobalah
Ketiga, kueri data dari people
tabel menggunakan SELECT
berikut ini pernyataan:
SELECT
rowid,
first_name,
last_name
FROM
people;
Code language: SQL (Structured Query Language) (sql)
Cobalah
Seperti yang Anda lihat dengan jelas dari output, SQLite secara implisit membuat kolom bernama rowid
dan secara otomatis memberikan nilai integer setiap kali Anda memasukkan baris baru ke dalam tabel.
Perhatikan bahwa Anda juga dapat merujuk ke rowid
kolom menggunakan aliasnya:_rowid_
dan oid
.
Saat Anda membuat tabel yang memiliki INTEGER PRIMARY KEY
kolom, kolom ini adalah alias dari rowid
kolom.
Pernyataan berikut menjatuhkan tabel people
dan membuatnya kembali. Namun kali ini, kami menambahkan kolom lain bernama person_id
yang tipe datanya INTEGER
dan batasan kolom adalah PRIMARY KEY
:
DROP TABLE people;
CREATE TABLE people (
person_id INTEGER PRIMARY KEY,
first_name TEXT NOT NULL,
last_name TEXT NOT NULL
);
Code language: SQL (Structured Query Language) (sql)
Cobalah
Dalam hal ini, person_id
kolom sebenarnya adalah rowid
kolom.
Bagaimana SQLite menetapkan nilai integer ke rowid
kolom?
Jika Anda tidak menentukan rowid
nilai atau Anda menggunakan NULL
nilai ketika Anda memasukkan baris baru, SQLite secara otomatis menetapkan bilangan bulat berurutan berikutnya, yang lebih besar dari rowid
terbesar di meja. rowid
nilai dimulai dari 1.
Nilai maksimum darirowid
kolomnya adalah 9,223,372,036,854,775,807
, yang sangat besar. Jika data Anda mencapai nilai maksimum ini dan Anda mencoba memasukkan baris baru, SQLite akan menemukan bilangan bulat yang tidak digunakan dan menggunakannya. Jika SQLite tidak dapat menemukan bilangan bulat yang tidak digunakan, itu akan mengeluarkan SQLITE_FULL
kesalahan. Selain itu, jika Anda menghapus beberapa baris dan menyisipkan baris baru, SQLite akan mencoba menggunakan kembali rowid
nilai dari baris yang dihapus.
Mari kita uji.
Pertama, masukkan baris dengan nilai maksimum ke dalam people
tabel.
INSERT INTO people (person_id,first_name,last_name)
VALUES( 9223372036854775807,'Johnathan','Smith');
Code language: SQL (Structured Query Language) (sql)
Cobalah
Kedua, masukkan baris lain tanpa menentukan nilai untuk person_id
kolom:
INSERT INTO people (first_name,last_name)
VALUES('William','Gate');
Code language: SQL (Structured Query Language) (sql)
Cobalah
Seperti yang ditunjukkan dengan jelas pada output, baris baru menerima bilangan bulat yang tidak digunakan.
Pertimbangkan contoh lain.
Pertama, buat tabel baru dengan nama t1
yang memiliki satu kolom:
CREATE TABLE t1(c text);
Code language: SQL (Structured Query Language) (sql)
Kedua, masukkan beberapa baris ke dalam t1
tabel:
INSERT INTO t1(c) VALUES('A');
INSERT INTO t1(c) values('B');
INSERT INTO t1(c) values('C');
INSERT INTO t1(c) values('D');
Code language: SQL (Structured Query Language) (sql)
Ketiga, query data dari t1
tabel:
SELECT rowid, c FROM t1;
Code language: SQL (Structured Query Language) (sql)
Keempat, hapus semua baris t1
tabel:
DELETE FROM t1;
Code language: SQL (Structured Query Language) (sql)
Kelima, masukkan beberapa baris ke dalam t1
tabel:
INSERT INTO t1(c) values('E');
INSERT INTO t1(c) values('F');
INSERT INTO t1(c) values('G');
Code language: SQL (Structured Query Language) (sql)
Terakhir, kueri data dari t1
tabel:
SELECT rowid, c FROM t1;
Code language: SQL (Structured Query Language) (sql)
Seperti yang Anda lihat, rowid 1, 2 dan 3 telah digunakan kembali untuk baris baru.
SQLite AUTOINCREMENT
atribut kolom
SQLite menyarankan agar Anda tidak menggunakan AUTOINCREMENT
atribut karena:
AUTOINCREMENT
kata kunci memaksakan CPU ekstra, memori, ruang disk, dan overhead I/O disk dan harus dihindari jika tidak benar-benar diperlukan. Biasanya tidak diperlukan.
Selain itu, cara SQLite memberikan nilai untuk AUTOINCREMENT
kolom sedikit berbeda dari cara yang dilakukannya untuk rowid
kolom.
Perhatikan contoh berikut.
Pertama, jatuhkan dan buat ulang people
meja. Kali ini kita menggunakan AUTOINCREMENT
kolom atribut:
DROP TABLE people;
CREATE TABLE people (
person_id INTEGER PRIMARY KEY AUTOINCREMENT,
first_name text NOT NULL,
last_name text NOT NULL
);
Code language: SQL (Structured Query Language) (sql)
Cobalah
Kedua, masukkan baris dengan rowid
maksimum nilai ke dalam people
tabel.
INSERT INTO people (person_id,first_name,last_name)
VALUES(9223372036854775807,'Johnathan','Smith');
Code language: SQL (Structured Query Language) (sql)
Cobalah
Ketiga, masukkan baris lain ke dalam people
tabel.
INSERT INTO people (first_name,last_name)
VALUES('John','Smith');
Code language: SQL (Structured Query Language) (sql)
Cobalah
Kali ini, SQLite mengeluarkan pesan kesalahan karena person_id
kolom tidak menggunakan kembali nomor seperti rowid
kolom.
[Err] 13 - database or disk is full
Code language: SQL (Structured Query Language) (sql)
Kapan Anda harus menggunakan AUTOINCREMENT
atribut kolom?
Tujuan utama menggunakan atribut AUTOINCREMENT
adalah untuk mencegah SQLite menggunakan kembali nilai yang belum digunakan atau nilai dari baris yang dihapus sebelumnya.
Jika Anda tidak memiliki persyaratan seperti ini, Anda tidak boleh menggunakan AUTOINCREMENT
atribut di kunci utama.
Dalam tutorial ini, Anda telah mempelajari bagaimana SQLite AUTOINCREMENT
atribut bekerja dan bagaimana pengaruhnya terhadap cara SQLite memberikan nilai ke kolom kunci utama.