relasi tabel kunjungan pasien | java php laravel linux mysql sql bootstrap html css query java php laravel linux mysql sql bootstrap html css query: relasi tabel kunjungan pasien

Monday, October 12, 2026

relasi tabel kunjungan pasien

🏥🔗🗂️
Relasi Tabel MySQL Foreign Key JOIN Form Kunjungan

Hubungkan Pasien dan Poli: Relasi Tabel, Foreign Key, dan Form Pendaftaran Kunjungan Pasien (JOIN)

Artikel 12 dari 16 · Seri Pemrograman Web D4 MIK · CPMK 5, Sub-CPMK 8

⏱️
±12 menit
Estimasi baca
📊
Menengah–Lanjut
Level
📅
2026
Tahun

Bayangkan petugas pendaftaran mengetik nama pasien dan nama poli berulang-ulang di setiap kunjungan. Salah ketik satu huruf, "Poli Gigi" berubah jadi "Poli Gigy", dan laporan jumlah kunjungan langsung kacau. Solusinya adalah relasi tabel MySQL: data pasien dan poli disimpan satu kali, lalu dihubungkan lewat foreign key.

Artikel ini adalah bagian dari seri Pemrograman Web D4 MIK. Kamu akan membuat tabel kunjungan, menggabungkannya dengan JOIN, dan membangun form pendaftaran kunjungan pasien dengan PHP. Semua praktik memakai XAMPP, phpMyAdmin, dan Sublime Text dengan data fiktif. Siap menyambungkan dua modul yang sudah kamu buat?

Konsep Dasar Relasi Tabel MySQL: Pasien dan Poli Saling Terhubung

Bayangkan kartu berobat. Setiap pasien punya nomor kartu unik, dan setiap poli punya kode ruangan. Saat pasien datang, petugas tidak menulis ulang identitas lengkapnya. Petugas cukup mencatat "kartu nomor sekian, ke ruangan sekian". Catatan itulah tabel kunjungan. Pasien dan poli adalah data induk (master), sedangkan kunjungan adalah data transaksi.

📐 FORMULA KONSEP
Primary Key (tabel induk) ← Foreign Key (tabel anak)
pasien.id_pasien 1 ──< N kunjungan.id_pasien
poli.id_poli 1 ──< N kunjungan.id_poli
Foreign key adalah kolom di tabel anak yang nilainya wajib sama dengan primary key di tabel induk. Hubungan ini disebut one-to-many.
┌─────────────┐      ┌────────────────┐      ┌───────────┐
│   pasien    │ 1──N │   kunjungan    │ N──1 │   poli    │
│ id_pasien PK│◄─────│ id_pasien FK   │─────►│ id_poli PK│
│ no_rm       │      │ id_poli   FK   │      │ nama_poli │
│ nama_pasien │      │ tgl_kunjungan  │      └───────────┘
└─────────────┘      └────────────────┘
⚡ Insight Penting: Foreign key bekerja seperti satpam. MySQL akan menolak kunjungan untuk pasien atau poli yang tidak ada di tabel master. Dengan begitu, data "hantu" tidak bisa masuk.
TabelJenisKunciPeran
pasienMasterPK id_pasienIdentitas pasien
poliMasterPK id_poliDaftar pelayanan
kunjunganTransaksiFK id_pasien, id_poliMencatat siapa ke poli mana

Praktik 1: Membuat Relasi Tabel MySQL dengan Foreign Key

1
Nyalakan layanan.
Buka XAMPP Control Panel, klik Start pada Apache dan MySQL.
2
Buka phpMyAdmin.
Akses http://localhost/phpmyadmin, lalu pilih database db_klinik. Kalau belum ada, buat baru dengan nama itu.
3
Jalankan skrip SQL.
Klik tab SQL, tempel kode di bawah, lalu klik Go. Kalau tabel pasien dan poli dari artikel sebelumnya sudah ada, lewati dua CREATE pertama dan INSERT-nya. Pastikan tipe kolom primary key-nya sama dengan skrip ini.
📄 skrip_relasi.sql
CREATE TABLE IF NOT EXISTS pasien (
  id_pasien INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  no_rm VARCHAR(10) NOT NULL UNIQUE,
  nama_pasien VARCHAR(100) NOT NULL
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS poli (
  id_poli INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  nama_poli VARCHAR(50) NOT NULL
) ENGINE=InnoDB;

CREATE TABLE kunjungan (
  id_kunjungan INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  id_pasien INT UNSIGNED NOT NULL,
  id_poli INT UNSIGNED NOT NULL,
  tgl_kunjungan DATE NOT NULL,
  keluhan VARCHAR(255),
  CONSTRAINT fk_kunjungan_pasien FOREIGN KEY (id_pasien)
    REFERENCES pasien(id_pasien) ON DELETE RESTRICT ON UPDATE CASCADE,
  CONSTRAINT fk_kunjungan_poli FOREIGN KEY (id_poli)
    REFERENCES poli(id_poli) ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB;

INSERT INTO pasien (no_rm, nama_pasien) VALUES
  ('RM001','Siti Aminah'), ('RM002','Budi Santoso');
INSERT INTO poli (nama_poli) VALUES
  ('Poli Umum'), ('Poli Gigi'), ('Poli KIA');
4
Cek hasilnya.
Buka tabel kunjungan, klik tab Structure → Relation view (atau menu Designer). Kamu akan melihat dua foreign key aktif.
🔥 Fakta Menarik: Menurut dokumentasi MySQL, foreign key hanya berfungsi pada mesin penyimpanan InnoDB. Karena itu skrip di atas memakai ENGINE=InnoDB. XAMPP versi terbaru sebenarnya memakai MariaDB, tetapi sintaks dan perilaku foreign key untuk praktik ini sama.
🔍 Analisis: Pilih Aturan ON DELETE yang Tepat
AturanPerilakuCocok untuk data medis?
RESTRICTMenolak hapus jika masih dipakai✅ Aman, riwayat kunjungan terjaga
CASCADEIkut menghapus data anak⚠️ Berbahaya, riwayat bisa hilang
SET NULLKolom FK diisi NULL❌ Kunjungan jadi tanpa pasien

JOIN dalam Relasi Tabel MySQL: Gabungkan Data Kunjungan, Pasien, dan Poli

Tabel kunjungan hanya berisi angka ID, jadi petugas tidak bisa membacanya. JOIN berfungsi seperti mencocokkan nomor kartu dengan buku besar identitas, sehingga angka berubah menjadi nama pasien dan nama poli. Jalankan dua kunjungan fiktif ini, lalu query JOIN-nya di tab SQL:

📄 query_join.sql
INSERT INTO kunjungan (id_pasien, id_poli, tgl_kunjungan, keluhan) VALUES
  (1, 2, '2026-10-12', 'Sakit gigi geraham'),
  (2, 1, '2026-10-12', 'Demam tiga hari');

SELECT k.id_kunjungan, p.no_rm, p.nama_pasien,
       pl.nama_poli, k.tgl_kunjungan, k.keluhan
FROM kunjungan k
INNER JOIN pasien p ON k.id_pasien = p.id_pasien
INNER JOIN poli pl ON k.id_poli = pl.id_poli
ORDER BY k.tgl_kunjungan DESC;

Hasil yang diharapkan: dua baris muncul dengan kolom nama_pasien (Siti Aminah, Budi Santoso) dan nama_poli (Poli Gigi, Poli Umum), bukan lagi angka 1 dan 2.

Jenis JOINHasilContoh kegunaan
INNER JOINHanya data yang cocok di kedua tabelDaftar kunjungan lengkap
LEFT JOINSemua data tabel kiri, yang tak cocok berisi NULLPoli yang belum punya kunjungan
💡 Tips: Beri alias pendek pada tabel (k, p, pl). Query jadi lebih ringkas, dan kamu terhindar dari error kolom ambigu.

Praktik 2: Form Pendaftaran Kunjungan dari Relasi Tabel MySQL ke PHP

1
Siapkan folder.
Buat folder C:\xampp\htdocs\klinik, lalu buka di Sublime Text.
2
Buat koneksi.php.
Kalau sudah punya file koneksi dari artikel sebelumnya, pakai saja.
📄 koneksi.php
<?php
mysqli_report(MYSQLI_REPORT_OFF); // error ditangani manual
$conn = mysqli_connect('localhost', 'root', '', 'db_klinik');
if (!$conn) {
    die('Koneksi gagal: ' . mysqli_connect_error());
}
3
Buat kunjungan.php.
File ini berisi tiga hal: proses simpan, form dengan dropdown dari tabel master, dan tabel hasil JOIN.
📄 kunjungan.php
<?php
include 'koneksi.php';
$pesan = '';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $stmt = mysqli_prepare($conn, "INSERT INTO kunjungan
        (id_pasien, id_poli, tgl_kunjungan, keluhan) VALUES (?, ?, ?, ?)");
    mysqli_stmt_bind_param($stmt, 'iiss', $_POST['id_pasien'],
        $_POST['id_poli'], $_POST['tgl'], $_POST['keluhan']);
    $pesan = mysqli_stmt_execute($stmt)
        ? 'Kunjungan berhasil disimpan.'
        : 'Gagal: ' . mysqli_stmt_error($stmt);
}
$pasien = mysqli_query($conn, "SELECT id_pasien, no_rm, nama_pasien FROM pasien ORDER BY nama_pasien");
$poli   = mysqli_query($conn, "SELECT id_poli, nama_poli FROM poli ORDER BY nama_poli");
$data   = mysqli_query($conn, "SELECT k.id_kunjungan, p.no_rm, p.nama_pasien,
    pl.nama_poli, k.tgl_kunjungan, k.keluhan FROM kunjungan k
    JOIN pasien p ON k.id_pasien = p.id_pasien
    JOIN poli pl ON k.id_poli = pl.id_poli
    ORDER BY k.id_kunjungan DESC");
?>
<h2>Pendaftaran Kunjungan Pasien</h2>
<p><?= htmlspecialchars($pesan) ?></p>
<form method="post">
  <select name="id_pasien" required>
    <option value="">-- Pilih Pasien --</option>
    <?php while ($r = mysqli_fetch_assoc($pasien)) { ?>
      <option value="<?= $r['id_pasien'] ?>">
        <?= htmlspecialchars($r['no_rm'] . ' - ' . $r['nama_pasien']) ?></option>
    <?php } ?>
  </select>
  <select name="id_poli" required>
    <option value="">-- Pilih Poli --</option>
    <?php while ($r = mysqli_fetch_assoc($poli)) { ?>
      <option value="<?= $r['id_poli'] ?>">
        <?= htmlspecialchars($r['nama_poli']) ?></option>
    <?php } ?>
  </select>
  <input type="date" name="tgl" required>
  <input type="text" name="keluhan" placeholder="Keluhan">
  <button type="submit">Simpan</button>
</form>
<table border="1" cellpadding="6">
  <tr><th>No RM</th><th>Pasien</th><th>Poli</th><th>Tanggal</th><th>Keluhan</th></tr>
  <?php while ($d = mysqli_fetch_assoc($data)) { ?>
  <tr>
    <td><?= htmlspecialchars($d['no_rm']) ?></td>
    <td><?= htmlspecialchars($d['nama_pasien']) ?></td>
    <td><?= htmlspecialchars($d['nama_poli']) ?></td>
    <td><?= $d['tgl_kunjungan'] ?></td>
    <td><?= htmlspecialchars($d['keluhan']) ?></td>
  </tr>
  <?php } ?>
</table>
4
Uji di browser.
Buka http://localhost/klinik/kunjungan.php. Pilih pasien, poli, tanggal, dan isi keluhan, lalu klik Simpan. Hasil yang diharapkan: muncul pesan sukses, dan baris baru tampil paling atas di tabel dengan nama pasien serta nama poli.
⚡ Insight Penting: Dropdown mengambil data langsung dari tabel master, jadi petugas tidak bisa mengetik poli yang tidak ada. Tanda tanya (?) pada prepared statement juga melindungi form dari SQL injection, sesuai rekomendasi OWASP.

Error yang Sering Muncul pada Relasi Tabel MySQL & Cara Mengatasinya

Pesan ErrorPenyebabSolusi
#1452 Cannot add or update a child rowID pasien/poli tidak ada di tabel indukIsi data master dulu, pilih lewat dropdown
#1451 Cannot delete or update a parent rowData master masih dipakai kunjunganHapus kunjungan terkait dulu, atau jangan hapus data master
#1215 Cannot add foreign key constraintTipe kolom beda (misal INT vs INT UNSIGNED) atau engine bukan InnoDBSamakan tipe data dan gunakan InnoDB
#1052 Column ... is ambiguousNama kolom sama di dua tabelTulis dengan alias, misalnya p.nama_pasien
⚠️ Perhatian: Jangan menghapus tabel master sembarangan di phpMyAdmin hanya demi menghilangkan error #1451. Di sistem kesehatan nyata, riwayat kunjungan tidak boleh hilang.
✍️ Latihan Mandiri
  1. Filter kunjungan. Tambahkan form pencarian pada kunjungan.php untuk menampilkan kunjungan berdasarkan poli dan tanggal memakai WHERE.
  2. Rekap per poli. Buat query LEFT JOIN + GROUP BY yang menampilkan jumlah kunjungan setiap poli, termasuk poli yang jumlahnya 0.
  3. Uji integritas. Coba hapus pasien yang sudah punya kunjungan. Catat pesan errornya, lalu jelaskan dengan bahasamu sendiri mengapa MySQL menolaknya.
🎯 Kesimpulan

Kamu sudah menyambungkan data pasien dan master poli. Intinya, relasi tabel MySQL menyimpan setiap data sekali di tabel master, lalu menghubungkannya ke tabel kunjungan lewat foreign key. JOIN mengubah angka ID menjadi informasi yang bisa dibaca, dan form PHP dengan dropdown menjaga data tetap bersih.

Bagaimana hasil praktikmu? Ceritakan error yang kamu temui di kolom komentar, dan bagikan artikel ini ke teman sekelasmu!

💬 Tulis Komentar 📤 Bagikan via WhatsApp
📚 Referensi:
#PemrogramanWeb #D4MIK #ForeignKey #JOINMySQL #KunjunganPasien
🏷️ Label: Relasi Tabel MySQL Form Pendaftaran Kunjungan Pasien Foreign Key dan JOIN
📚
Pemrograman Web D4 MIK

Lihat seluruh 16 artikel dalam seri ini, dari dasar HTML sampai aplikasi web terintegrasi.

📖 Buka Daftar Isi Artikel

No comments:

Post a Comment

saifiahmada.com adalah blog belajar programming Indonesia, membahas lengkap materi bahasa pemrograman: code HTML, CSS, Bootstrap, Desain, PHP, MySQL, coding Java, Query, SQL, dan dunia linux