CREATE TABLE menambahkan tabel baru ke database. Anda memberi nama tabel dan mendaftar kolom-kolomnya, masing-masing dengan tipe data dan aturan (constraint) yang harus dipatuhi nilainya. Contoh-contohnya berlaku di PostgreSQL, MySQL, SQLite, dan SQL Server.
Cara menggunakan CREATE TABLE
Beri nama tabel, lalu daftarkan kolom-kolomnya di dalam tanda kurung, dipisahkan koma. Setiap kolom memiliki nama, tipe data, dan, jika perlu, constraint seperti PRIMARY KEY, NOT NULL, UNIQUE, DEFAULT, atau CHECK:
CREATE TABLE table_name (
column_name data_type constraints,
another_column data_type constraints
);
CREATE TABLE customers (
id INTEGER PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(255) UNIQUE,
country CHAR(2) DEFAULT 'US',
signed_up DATE
);
INSERT INTO customers (id, name, email, signed_up)
VALUES (1, 'Ana Lima', 'ana@example.com', '2026-03-02');
SELECT * FROM customers;
-- Output:
-- id | name | email | country | signed_up
-- ---+----------+-----------------+---------+-----------
-- 1 | Ana Lima | ana@example.com | US | 2026-03-02
Tabel baru masih kosong sampai Anda menyisipkan baris ke dalamnya. Insert ini tidak menyertakan country, jadi baris tersebut mendapat nilai default, US.
Aturan yang perlu diketahui
-
SQLite tidak memaksakan tipe atau panjang. Ketika database lain menolak nilai yang tidak cocok dengan kolomnya, SQLite tetap menyimpannya. Tambahkan
STRICTsetelah tanda kurung penutup agar SQLite melakukan pengecekan (tabel strict hanya menerima tipeINT,INTEGER,REAL,TEXT,BLOB, danANY).
CREATE TABLE products (
sku VARCHAR(5),
quantity INTEGER
);
-- SQLite stores this row; other databases reject it with an error
INSERT INTO products VALUES ('LAMP-001', 'twelve');
SELECT sku, quantity FROM products;
-- Output (SQLite):
-- sku | quantity
-- ---------+---------
-- LAMP-001 | twelve
-
Deklarasikan foreign key di baris
FOREIGN KEYtersendiri, bukan sebagaiREFERENCESdi dalam definisi kolom: MySQL 8 menerima bentuk singkat itu lalu mengabaikannya. SQLite baru memberlakukan foreign key setelahPRAGMA foreign_keys = ON;, yang harus Anda jalankan di setiap koneksi. -
CREATE TABLE gagal jika tabel sudah ada. Tulis
CREATE TABLE IF NOT EXISTSagar dilewati saja. -
Di MySQL, kolom
TEXTtidak bisa memilikiDEFAULTatauUNIQUE. GunakanVARCHAR(n), seperti pada contoh-contoh di sini.
Sintaks alternatif
Id bernomor otomatis ditulis secara berbeda di tiap database:
| Database | Kolom id bernomor otomatis |
|---|---|
| PostgreSQL | id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY |
| MySQL | id INT AUTO_INCREMENT PRIMARY KEY |
| SQLite | id INTEGER PRIMARY KEY |
| SQL Server | id INT IDENTITY(1,1) PRIMARY KEY |
Jika id tidak disertakan dalam insert, database akan mengisi nomor berikutnya.
SQL Server juga punya nama sendiri untuk kolom true/false dan tanggal-waktu, serta tidak punya IF NOT EXISTS. Gunakan BIT (dengan 1 dan 0) sebagai ganti BOOLEAN, DATETIME2 untuk tanggal dan waktu (TIMESTAMP miliknya adalah nomor versi baris, bukan tanggal), dan periksa OBJECT_ID sebelum membuat tabel:
-- SQL Server
IF OBJECT_ID('users', 'U') IS NULL
CREATE TABLE users (
id INT IDENTITY(1,1) PRIMARY KEY,
email VARCHAR(255) NOT NULL UNIQUE,
is_active BIT NOT NULL DEFAULT 1,
created_at DATETIME2 NOT NULL DEFAULT CURRENT_TIMESTAMP
);
Kapan sebaiknya menggunakan CREATE TABLE?
Setiap tabel dimulai dengan CREATE TABLE, tetapi kolom dan constraint yang Anda pilih menyelesaikan masalah yang berbeda-beda.
Menyimpan jenis data baru
Setiap jenis hal yang dilacak aplikasi Anda, seperti pelanggan, buku, atau faktur, mendapat tabelnya sendiri, dengan satu kolom untuk setiap informasi tentangnya dan tipe yang sesuai dengan nilainya.
Memberi setiap baris ID unik
PRIMARY KEY mencegah dua baris memakai identifier yang sama, sehingga Anda selalu bisa menemukan, memperbarui, atau menautkan tepat satu baris. Biarkan database memberi nomor pada baris (lihat “Sintaks alternatif” di atas), atau gabungkan dua kolom jika dibutuhkan sepasang nilai untuk mengidentifikasi satu baris.
Mencegah data yang salah atau kosong
Constraint menolak baris yang melanggar aturan Anda: NOT NULL untuk kolom wajib, UNIQUE untuk nilai seperti alamat email, dan CHECK untuk rentang yang diizinkan. DEFAULT mengisi kolom yang tidak disertakan dalam insert.
Menautkan tabel yang berhubungan
FOREIGN KEY membuat sebuah kolom merujuk ke baris di tabel lain, sehingga pesanan tidak bisa mencantumkan pelanggan yang tidak ada. Tambahkan ON DELETE CASCADE, dan menghapus baris induk juga akan menghapus baris-baris yang merujuk ke sana.
Menyimpan hasil query sebagai tabel
CREATE TABLE ... AS SELECT membuat tabel dan mengisinya dari query dalam satu statement. Gunakan untuk snapshot, tabel laporan, atau backup baris yang akan Anda ubah.
Contoh nyata CREATE TABLE
Pesan error berikut berasal dari PostgreSQL. Database lain menolak baris yang sama dengan kata-kata mereka sendiri.
Tabel penghubung dengan key dua kolom
Mahasiswa mengambil banyak mata kuliah, dan mata kuliah memiliki banyak mahasiswa. Tabel enrollments menghubungkan keduanya, dan primary key-nya adalah pasangan id tersebut, sehingga seorang mahasiswa bisa mengikuti banyak mata kuliah tetapi tidak bisa mengikuti mata kuliah yang sama dua kali:
CREATE TABLE enrollments (
student_id INTEGER NOT NULL,
course_id INTEGER NOT NULL,
enrolled_on DATE,
PRIMARY KEY (student_id, course_id)
);
INSERT INTO enrollments VALUES (1, 101, '2026-09-01');
INSERT INTO enrollments VALUES (1, 102, '2026-09-01');
INSERT INTO enrollments VALUES (1, 101, '2026-09-08');
-- ERROR: duplicate key value violates unique constraint "enrollments_pkey"
-- DETAIL: Key (student_id, course_id)=(1, 101) already exists.
SELECT * FROM enrollments;
-- Output:
-- student_id | course_id | enrolled_on
-- -----------+-----------+------------
-- 1 | 101 | 2026-09-01
-- 1 | 102 | 2026-09-01
Pendaftaran yang mematuhi aturan
Setiap akun membutuhkan alamat email yang tidak dipakai akun lain dan minimal satu seat. Akun baru dimulai di tier gratis dengan satu seat:
CREATE TABLE accounts (
id INTEGER PRIMARY KEY,
email VARCHAR(255) NOT NULL UNIQUE,
tier VARCHAR(20) NOT NULL DEFAULT 'free',
seats INTEGER NOT NULL DEFAULT 1 CHECK (seats > 0)
);
INSERT INTO accounts (id, email) VALUES (1, 'sam@example.com');
SELECT * FROM accounts;
-- Output:
-- id | email | tier | seats
-- ---+-----------------+------+------
-- 1 | sam@example.com | free | 1
INSERT INTO accounts (id, email) VALUES (2, 'sam@example.com');
-- ERROR: duplicate key value violates unique constraint "accounts_email_key"
INSERT INTO accounts (id, email, seats) VALUES (3, 'kim@example.com', 0);
-- ERROR: new row ... violates check constraint "accounts_seats_check"
INSERT INTO accounts (id) VALUES (4);
-- ERROR: null value in column "email" ... violates not-null constraint
Pesanan yang wajib dimiliki pelanggan
Setiap pesanan merujuk ke seorang pelanggan. Foreign key menolak pesanan untuk pelanggan yang tidak ada, dan ON DELETE CASCADE menghapus pesanan pelanggan ketika pelanggan tersebut dihapus. Di SQLite, jalankan PRAGMA foreign_keys = ON; terlebih dahulu.
CREATE TABLE customers (
id INTEGER PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
CREATE TABLE orders (
id INTEGER PRIMARY KEY,
customer_id INTEGER NOT NULL,
total DECIMAL(10,2),
FOREIGN KEY (customer_id) REFERENCES customers(id) ON DELETE CASCADE
);
-- Input: customers
-- id | name
-- ---+-----------
-- 1 | Ana Lima
-- 2 | Ben Okafor
-- Input: orders
-- id | customer_id | total
-- ---+-------------+------
-- 10 | 1 | 25.00
-- 11 | 1 | 60.00
-- 12 | 2 | 42.50
INSERT INTO orders VALUES (13, 99, 15.00);
-- ERROR: ... violates foreign key constraint "orders_customer_id_fkey"
-- DETAIL: Key (customer_id)=(99) is not present in table "customers".
DELETE FROM customers WHERE id = 1;
-- Output (orders after the DELETE):
-- id | customer_id | total
-- ---+-------------+------
-- 12 | 2 | 42.50
Snapshot pelanggan aktif
Salin pelanggan yang memesan tahun ini ke tabel tersendiri, untuk daftar kampanye yang tidak boleh berubah saat pesanan baru masuk:
-- Input: customers
-- customer_id | name | email | last_order_date
-- ------------+------------+-------------------+----------------
-- 1 | Ana Lima | ana@example.com | 2026-03-18
-- 2 | Ben Okafor | ben@example.com | 2025-11-02
-- 3 | Chloe Park | chloe@example.com | 2026-06-30
-- 4 | Dev Shah | dev@example.com | NULL
CREATE TABLE active_customers AS
SELECT customer_id, name, email
FROM customers
WHERE last_order_date >= '2026-01-01';
-- SQL Server has no CREATE TABLE ... AS. Use SELECT ... INTO:
SELECT customer_id, name, email
INTO active_customers
FROM customers
WHERE last_order_date >= '2026-01-01';
-- Output (active_customers):
-- customer_id | name | email
-- ------------+------------+------------------
-- 1 | Ana Lima | ana@example.com
-- 3 | Chloe Park | chloe@example.com
Tabel baru mendapat kolom, tipenya, dan barisnya, tetapi tidak dengan primary key atau constraint lainnya. Tambahkan dengan ALTER TABLE jika Anda membutuhkannya.
Bacaan lanjutan tentang CREATE TABLE
Di blog ini:
- Panduan SQL temp table: tabel yang hanya bertahan selama sesi Anda
- SQL ALTER TABLE add column: mengubah tabel setelah Anda membuatnya
- Composite primary key di SQL: key yang terdiri dari lebih dari satu kolom
- Cara menggunakan foreign key di PostgreSQL: foreign key dan aksi delete-nya secara lebih mendalam
- Panduan relasi database: merancang tabel yang saling terhubung
- Statement SQL INSERT: menambahkan baris ke tabel baru
- Pembuat tabel SQL: susun statement CREATE TABLE di browser alih-alih menulisnya manual
Dokumentasi resmi:
Beekeeper Studio Adalah GUI Database Gratis & Open Source
Tool query & editor SQL terbaik yang pernah saya pakai. Semua yang saya butuhkan untuk mengelola database ada di sini. - ⭐⭐⭐⭐⭐ Mit
Beekeeper Studio cepat, intuitif, dan mudah digunakan. Beekeeper mendukung banyak sekali database, dan berjalan mulus di Windows, Mac, dan Linux.
Apa Kata Pengguna tentang Beekeeper Studio
"Beekeeper Studio sepenuhnya menggantikan alur kerja SQL lama saya. Cepat, intuitif, dan membuat pekerjaan database kembali menyenangkan."
"Saya sudah mencoba banyak GUI database, tetapi Beekeeper punya keseimbangan sempurna antara fitur dan kesederhanaan. Langsung jalan."