Membuat Tabel & Memilih Tipe Data PostgreSQL
CREATE TABLE, kolom auto-increment (SERIAL/IDENTITY), dan memilih tipe data yang tepat: teks, angka, uang, tanggal, boolean, serta kenalan dengan JSONB dan array.
Analogi: Memilih tipe data itu seperti memilih wadah penyimpanan. Uang dan gula tidak boleh disimpan di wadah yang sama dengan air: NUMERIC seperti timbangan presisi untuk uang, TEXT seperti kardus untuk tulisan, DATE seperti kalender, BOOLEAN seperti saklar ya/tidak. Salah wadah, isinya tumpah atau rusak.
Membuat tabel: CREATE TABLE
Sebelum menyimpan data, kamu perlu "membuat rak"-nya: tabel dengan kolom-kolom beserta tipe datanya.
CREATE TABLE penerbit (
id SERIAL PRIMARY KEY,
nama VARCHAR(100) NOT NULL,
kota VARCHAR(50),
tgl_berdiri DATE,
aktif BOOLEAN
);
Setiap baris di dalam kurung adalah satu kolom: nama_kolom TIPE_DATA aturan-tambahan, dipisah koma. Kolom terakhir tidak diakhiri koma.
Tipe data yang paling sering dipakai
| Kebutuhan | Tipe | Contoh |
|---|---|---|
| Bilangan bulat | INTEGER (INT), BIGINT, SMALLINT | stok, umur, jumlah |
| Uang & desimal tepat | NUMERIC(10,2) | harga, saldo (10 digit, 2 di belakang koma) |
| Desimal perkiraan | REAL, DOUBLE PRECISION | suhu, koordinat (boleh sedikit tidak presisi) |
| Teks pendek dibatasi | VARCHAR(n) | nama, kota |
| Teks bebas | TEXT | deskripsi, isi artikel |
| Ya / tidak | BOOLEAN | aktif, sudah_bayar |
| Tanggal | DATE | tgl_lahir |
| Tanggal + jam | TIMESTAMP, TIMESTAMPTZ | dibuat_pada |
| Data JSON | JSONB | pengaturan, atribut tambahan |
| Identitas unik | UUID | id publik yang sulit ditebak |
Jangan simpan uang dengan FLOAT/REAL! Bilangan desimal perkiraan bisa menghasilkan selisih kecil (0.1 + 0.2 tidak persis 0.3). Untuk uang gunakan NUMERIC atau simpan dalam satuan terkecil sebagai INTEGER (misalnya rupiah utuh).
VARCHAR vs TEXT: mana yang dipilih?
Di PostgreSQL, TEXT dan VARCHAR performanya sama. Pilih VARCHAR(n) bila memang ada batas wajar (nama maksimal 100 karakter), dan TEXT bila panjangnya bebas. Banyak developer Postgres cukup memakai TEXT di mana-mana, ditambah aturan CHECK bila perlu.
Nomor urut otomatis: SERIAL dan IDENTITY
Kolom id sebaiknya terisi otomatis. Ada dua cara:
id SERIAL PRIMARY KEY -- cara klasik, paling umum
id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY -- cara modern sesuai standar SQL
SERIAL sebenarnya adalah jalan pintas: Postgres membuat sequence (penghitung) di belakang layar lalu memakainya sebagai nilai bawaan kolom. Hasilnya sama: 1, 2, 3, ... otomatis.
Sekilas tipe khas PostgreSQL
CREATE TABLE contoh (
id UUID,
tag TEXT[], -- array teks: {'novel','best-seller'}
atribut JSONB -- data JSON yang bisa dicari dan diindeks
);
Tipe seperti array dan JSONB membuat Postgres fleksibel: kamu bisa menyimpan data semi-terstruktur tanpa meninggalkan dunia relasional.
Menghapus dan mengganti tabel
DROP TABLE penerbit; -- hapus tabel (data ikut hilang!)
DROP TABLE IF EXISTS penerbit; -- tidak error bila tabel belum ada
Kasus nyata: rancangan tabel pelanggan toko online
Tim BukuKita merancang tabel pelanggan. Setiap kolom dipilih berdasarkan kebutuhan nyata:
CREATE TABLE pelanggan (
id SERIAL PRIMARY KEY,
nama VARCHAR(80) NOT NULL,
email VARCHAR(100),
saldo_poin INTEGER DEFAULT 0,
aktif BOOLEAN DEFAULT TRUE,
tgl_daftar DATE NOT NULL
);Perhatikan: poin memakai INTEGER (bilangan bulat), status memakai BOOLEAN bukan teks "ya"/"tidak", dan tanggal memakai DATE supaya bisa dihitung selisih harinya.
Kesalahan yang sering terjadi
- Menyimpan tanggal sebagai teks
'12/10/2026'. Hasilnya tidak bisa diurutkan atau dihitung dengan benar. - Memakai
REAL/FLOATuntuk uang. GunakanNUMERIC(12,2)atau simpan dalam rupiah bulat denganINTEGER/BIGINT. - Membuat
VARCHAR(10)untuk nomor telepon lalu data gagal masuk karena ada awalan +62. Beri ruang secukupnya, atau pakaiTEXT.