Soal 1Ketika kamu menjalankan ALTER TABLE table ADD COLUMN status TEXT DEFAULT 'active'; pada tabel yang sudah ada, apa yang terjadi pada kolom status di baris yang sudah ada?
Menambah/Mengubah Batasan dan Redefinisi Tabel
Memakai tabel legacy_user, pelajari cara me-retrofit kolom dengan ALTER TABLE ADD COLUMN ... DEFAULT dan cara membangun ulang tabel untuk menjadikan email NOT NULL UNIQUE (CREATE baru → INSERT SELECT → DROP → RENAME) — semuanya langsung dipraktikkan di browser.
Data yang akan kita pakai — legacy_user
Tabel di produksi sering kali ternyata membutuhkan batasan yang tidak disertakan di desain awal.
Hal-hal seperti "lekatkan nilai default ke kolom ini," "jadikan email bebas duplikat (UNIQUE)," atau "tandai field wajib ini sebagai NOT NULL."
Artikel ini membahas penambahan kolom dan retrofit nilai default, serta prosedur rebuild tabel untuk menambahkan batasan ke tabel yang sudah ada.
ALTER TABLE ADD COLUMN — retrofit kolom dan nilai default
Untuk menambah kolom baru ke tabel yang sudah ada, gunakan ALTER TABLE table ADD COLUMN nama_kolom tipe batasan.
Melekatkan DEFAULT value menetapkan nilai default yang dipakai ketika kolom dikosongkan, dan saat ALTER nilai itu juga mengisi setiap baris yang sudah ada.
ADD COLUMN bahkan menerima NOT NULL ketika dikombinasikan dengan DEFAULT (baris yang ada diisi dengan default, jadi mereka tidak melanggar NOT NULL).
Sebaliknya, ADD COLUMN tidak bisa langsung melekatkan UNIQUE atau NOT NULL tanpa default.
Itu memerlukan "rebuild tabel".
-- Tambah kolom dengan DEFAULT (pakai tabel sekali pakai untuk melihat perilakunya)
DROP TABLE IF EXISTS alter_demo;
CREATE TABLE alter_demo(id INTEGER PRIMARY KEY, name TEXT);
INSERT INTO alter_demo VALUES (1,'Alice'),(2,'Bob');
-- Tambah created_on dengan DEFAULT → baris yang ada juga dapat nilainya
ALTER TABLE alter_demo ADD COLUMN created_on TEXT DEFAULT '2024-01-01';
-- NOT NULL juga bisa ketika dikombinasikan dengan DEFAULT
ALTER TABLE alter_demo ADD COLUMN status TEXT NOT NULL DEFAULT 'active';
SELECT * FROM alter_demo ORDER BY id;
Menambahkan batasan setelahnya berarti membangun ulang tabel
Di MySQL kamu bisa melekatkan batasan langsung ke tabel yang sudah ada, seperti ALTER TABLE legacy_user ADD CONSTRAINT uq_email UNIQUE (email);.
Di konsol kursus ini, me-retrofit UNIQUE atau NOT NULL ke tabel yang sudah ada melalui prosedur rebuild tabel: "buat tabel baru dengan batasan yang kamu inginkan, salin data yang ada, dan gantikan tabel lama."
MySQL / PostgreSQL juga melakukan pola rebuild ini secara internal untuk beberapa operasi (seperti perubahan tipe kolom), bergantung pada tool-nya.
Prosedurnya mengikuti gambar di bawah: matikan pemeriksaan foreign-key, lalu CREATE tabel baru → salin semua baris → DROP tabel lama → RENAME tabel baru → kembalikan pemeriksaannya.
Tentang ADD CONSTRAINT / AUTO_INCREMENT / komentar kolom MySQL
Sintaks ALTER TABLE ... ADD CONSTRAINT, AUTO_INCREMENT, dan komentar kolom (COMMENT '...') yang ditampilkan di bawah adalah sintaks MySQL.
Konsol browser di kursus ini tidak bisa menjalankannya, jadi kedua blok code ini hanya dibaca (jangan coba dieksekusi).
Di konsol kursus ini, retrofit batasan via rebuild tabel di bagian di bawah, dan pakai INTEGER PRIMARY KEY untuk auto-numbering.
-- Sintaks MySQL (jangan dijalankan di konsol kursus — cukup baca)
-- MySQL: lekatkan batasan UNIQUE langsung ke tabel yang sudah ada
ALTER TABLE legacy_user ADD CONSTRAINT uq_email UNIQUE (email);
-- MySQL: ubah menjadi NOT NULL via MODIFY
ALTER TABLE legacy_user MODIFY email VARCHAR(255) NOT NULL;
-- MySQL: auto-numbering adalah atribut kolom AUTO_INCREMENT; deskripsi adalah komentar kolom
CREATE TABLE member (
member_id INT PRIMARY KEY AUTO_INCREMENT,
email VARCHAR(255) NOT NULL UNIQUE COMMENT 'login email'
);
-- Di konsol kursus ini, dapatkan setara AUTO_INCREMENT via INTEGER PRIMARY KEY
CREATE TABLE member (
member_id INTEGER PRIMARY KEY,
email TEXT NOT NULL UNIQUE
);
-- Kerangka rebuild tabel (pakai tabel sekali pakai rebuild_demo untuk melihat perilakunya)
DROP TABLE IF EXISTS rebuild_demo;
CREATE TABLE rebuild_demo(id INTEGER PRIMARY KEY, email TEXT);
INSERT INTO rebuild_demo VALUES (1,'a@example.com'),(2,'b@example.com');
-- ① Matikan pemeriksaan foreign-key
PRAGMA foreign_keys=OFF;
-- ② Tabel baru dengan batasan yang diinginkan (email NOT NULL UNIQUE)
CREATE TABLE rebuild_demo_new(
id INTEGER PRIMARY KEY,
email TEXT NOT NULL UNIQUE
);
-- ③ Salin data yang ada
INSERT INTO rebuild_demo_new(id, email)
SELECT id, email FROM rebuild_demo;
-- ④ Drop tabel lama, ⑤ rename tabel baru ke nama lama
DROP TABLE rebuild_demo;
ALTER TABLE rebuild_demo_new RENAME TO rebuild_demo;
-- ⑥ Kembalikan pemeriksaan foreign-key
PRAGMA foreign_keys=ON;
-- Konfirmasi batasan terpasang (email duplikat sekarang akan error)
SELECT sql FROM sqlite_master WHERE name='rebuild_demo';
Cek Pemahaman
Jawab setiap pertanyaan satu per satu.
Soal 2Metode mana yang dipakai konsol kursus ini untuk me-retrofit batasan UNIQUE ke tabel yang sudah ada?
Soal 3Mengapa kamu menjalankan PRAGMA foreign_keys=OFF; di awal rebuild tabel dan mengembalikannya ke ON di akhir?