Database adalah wadah terbesar di PostgreSQL: di dalamnya nanti hidup schema, tabel, index, dan seluruh objek lain. Perintah DDL pertama yang kita jalankan secara serius karenanya adalah CREATE DATABASE — membuat ruang kerja bersih tempat seluruh latihan kita berlangsung. Pada chapter ini kita membuat dua database, berpindah ke dalamnya dengan \connect, mengenali database bawaan yang sudah disiapkan server, dan melihat dua kesalahan yang paling sering menghentikan pemula: nama ganda dan perintah yang dijalankan di dalam transaksi.
Perintah CREATE DATABASE #
Bentuk paling sederhana dari perintah ini hanya butuh satu nama. Ada satu syarat penting yang jarang disadati pemula: kita harus terhubung ke database lain saat menjalankannya — server tidak bisa membuat database dari dalam ruang kosong. Untuk itu kita bekerja dari database postgres, database maintenance bawaan yang selalu tersedia:
CREATE DATABASE latihan_db;
\connect latihan_db
SELECT current_database();Output yang Dihasilkan:
CREATE DATABASE
You are now connected to database "latihan_db" as user "postgres".
current_database
------------------
latihan_db
(1 row)Mari kita bedah tiga baris file di atas:
CREATE DATABASE latihan_db;: membuat database baru bernamalatihan_db. Nama memakai konvensi huruf kecil dengan garis bawah, sesuai aturan identifier yang sudah kita bahas di chapter sebelumnya.\connect latihan_db: meta-command milikpsql(bukan SQL) yang memindahkan sesi kita ke database yang baru saja dibuat. Tanpa langkah ini, sesi tetap berada di databasepostgres.SELECT current_database();: function bawaan yang melaporkan database tempat sesi kita terhubung saat ini — bukti bahwa perpindahan benar-benar terjadi.
Bekerja di Database Baru #
Database baru selalu lahir kosong. Kita bisa langsung mengisinya seperti biasa: membuat tabel, menyimpan data, membacanya kembali. File berikut membuat database untuk Toko Maju Jaya lalu mengisi tabel pertamanya tanpa pernah keluar dari psql:
CREATE DATABASE toko_maju_jaya;
\connect toko_maju_jaya
CREATE TABLE pelanggan (
id integer PRIMARY KEY,
nama text NOT NULL
);
INSERT INTO pelanggan (id, nama)
VALUES (1, 'Budi');
SELECT id, nama
FROM pelanggan
ORDER BY id;Output yang Dihasilkan:
CREATE DATABASE
You are now connected to database "toko_maju_jaya" as user "postgres".
CREATE TABLE
INSERT 0 1
id | nama
----+------
1 | Budi
(1 row)Tiga hal yang layak dicatat dari file tersebut: CREATE TABLE dan INSERT berjalan di dalam toko_maju_jaya (bukan postgres) karena \connect sudah memindahkan sesi lebih dulu; tabel pelanggan yang tercipta hanya ada di toko_maju_jaya — database latihan_db tetap kosong; dan perintah-perintah DDL setelah \connect sama persis dengan yang kita kenal, karena SQL-nya memang tidak berubah, hanya konteksnya.
Nama yang Sudah Dipakai #
Karena nama harus unik di seluruh cluster, membuat database kedua dengan nama yang sudah ada pasti ditolak. File berikut mencoba membuat latihan_db untuk kedua kalinya:
CREATE DATABASE latihan_db;Output yang Dihasilkan:
psql:nama-duplikat.sql:1: ERROR: database "latihan_db" already existsServer menghentikan perintah dengan pesan database "latihan_db" already exists — indikasi bahwa pengecekan nama dilakukan sebelum pekerjaan apa pun dimulai. Perlu diketahui juga: berbeda dengan CREATE TABLE, perintah CREATE DATABASE di PostgreSQL tidak memiliki opsi IF NOT EXISTS, jadi kita sendiri yang harus memastikan nama belum terpakai. Cara amannya: daftarkan isi pg_database dulu dengan SELECT datname FROM pg_database; sebelum memberi nama.
CREATE DATABASE Tidak Bisa Ikut Transaksi #
Transaksi adalah grup perintah yang dijalankan sepenuhnya atau tidak sama sekali — konsep yang kita bahas tuntas di Section Transactions. Membuat database tidak bisa dibungkus transaksi karena pembuatannya menyentuh struktur cluster, bukan isi satu tabel. File berikut mencoba melakukannya dan gagal:
BEGIN;
CREATE DATABASE gagal_db;Output yang Dihasilkan:
psql:dalam-transaksi.sql:3: ERROR: CREATE DATABASE cannot run inside a transaction blockBEGIN membuka transaksi, lalu server menolak CREATE DATABASE dengan pesan cannot run inside a transaction block. Konsekuensinya: kita tidak bisa menyiapkan script “buat database + isi tabel awal” sebagai satu transaksi tunggal — setiap CREATE DATABASE harus berdiri sendiri di luar transaksi.
Database Bawaan Server #
Server PostgreSQL yang baru dipasang sudah membawa tiga database. Query berikut menanyakannya langsung ke catalog pg_database, disaring ke nama-nama yang relevan untuk kita:
SELECT datname
FROM pg_database
WHERE datname IN ('postgres', 'template0', 'template1', 'latihan_db', 'toko_maju_jaya')
ORDER BY datname;Output yang Dihasilkan:
datname
----------------
latihan_db
postgres
template0
template1
toko_maju_jaya
(5 rows)Peran masing-masing database bawaan tersebut sebagai berikut:
| Database | Peran |
|---|---|
postgres | Database maintenance bawaan — pintu masuk default psql dan tempat menjalankan CREATE DATABASE |
template1 | Kerangka yang disalin setiap kali database baru dibuat; objek yang ditambahkan di sini ikut terbawa ke database baru |
template0 | Kerangka suci yang tidak boleh diubah; dipakai saat kita butuh salinan murni (misalnya dengan encoding berbeda) |
Alternatif CLI: createdb #
PostgreSQL juga menyediakan program kecil createdb di terminal yang melakukan hal yang sama persis:
createdb latihan_dbProgram ini hanyalah pembungkus: createdb terhubung ke server, lalu menjalankan CREATE DATABASE untuk kita. Gunakan yang mana saja — SQL untuk script yang akan dibaca orang lain, createdb untuk ketikan cepat di terminal.
Dua database kini siap dipakai. Pertanyaan berikutnya: begitu sebuah database berisi puluhan tabel, bagaimana cara mengatur keramaian itu? Jawaban PostgreSQL adalah schema — laci-laci logis di dalam satu database — yang menjadi topik chapter Membuat Schema.
Referensi #
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
buat-database-toko.sql
Unduh berkasCREATE DATABASE toko_maju_jaya;
\connect toko_maju_jaya
CREATE TABLE pelanggan (
id integer PRIMARY KEY,
nama text NOT NULL
);
INSERT INTO pelanggan (id, nama)
VALUES (1, 'Budi');
SELECT id, nama
FROM pelanggan
ORDER BY id;
buat-database.sql
Unduh berkasCREATE DATABASE latihan_db;
\connect latihan_db
SELECT current_database();
cek-database.sql
Unduh berkasSELECT datname
FROM pg_database
WHERE datname IN ('postgres', 'template0', 'template1', 'latihan_db', 'toko_maju_jaya')
ORDER BY datname;
dalam-transaksi.sql
Unduh berkasBEGIN;
CREATE DATABASE gagal_db;
nama-duplikat.sql
Unduh berkasCREATE DATABASE latihan_db;