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:

text
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:

  1. CREATE DATABASE latihan_db;: membuat database baru bernama latihan_db. Nama memakai konvensi huruf kecil dengan garis bawah, sesuai aturan identifier yang sudah kita bahas di chapter sebelumnya.
  2. \connect latihan_db: meta-command milik psql (bukan SQL) yang memindahkan sesi kita ke database yang baru saja dibuat. Tanpa langkah ini, sesi tetap berada di database postgres.
  3. 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:

text
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:

text
psql:nama-duplikat.sql:1: ERROR:  database "latihan_db" already exists

Server 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:

text
psql:dalam-transaksi.sql:3: ERROR:  CREATE DATABASE cannot run inside a transaction block

BEGIN 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:

text
    datname     
----------------
 latihan_db
 postgres
 template0
 template1
 toko_maju_jaya
(5 rows)

Peran masing-masing database bawaan tersebut sebagai berikut:

DatabasePeran
postgresDatabase maintenance bawaan — pintu masuk default psql dan tempat menjalankan CREATE DATABASE
template1Kerangka yang disalin setiap kali database baru dibuat; objek yang ditambahkan di sini ikut terbawa ke database baru
template0Kerangka 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:

bash
createdb latihan_db

Program 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 berkas
sql
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;

buat-database.sql

Unduh berkas
sql
CREATE DATABASE latihan_db;

\connect latihan_db

SELECT current_database();

cek-database.sql

Unduh berkas
sql
SELECT datname
FROM pg_database
WHERE datname IN ('postgres', 'template0', 'template1', 'latihan_db', 'toko_maju_jaya')
ORDER BY datname;

dalam-transaksi.sql

Unduh berkas
sql
BEGIN;

CREATE DATABASE gagal_db;

nama-duplikat.sql

Unduh berkas
sql
CREATE DATABASE latihan_db;