Tutorial PostgreSQL - References

    Pada materi kali ini, kita akan melanjutkan seri dari Tutorial PostgreSQL. Setelah sebelumnya kita membahas Relasi Antar Tabel, sekarang kita akan berkenalan dengan References.


    Pada materi sebelumnya, kita sudah pernah menggunakan salah satu jenis References. Seperti pada tabel social_media_accounts kita menggunakan References CASCADE untuk kolom user_id. Di materi kali ini, kita akan coba membahas lebih dalam tentang References dan jenis-jenisnya.

Apa Itu References (Referensi)?

    References adalah sebuah konsep untuk mendefinisikan hubungan antar tabel dalam database relasional. Hubungan ini diterapkan dengan Foreign Key, yang mengacu pada kolom (atribut) di tabel lain untuk memastikan integritas referensial.

    PostgreSQL menyediakan ON DELETE dan ON UPDATE sebagai opsi untuk menentukan perilaku yang terjadi pada data di tabel anak ketika data di tabel induk dihapus atau diperbarui.

Jenis-Jenis Referensi :
  1. CASCADE
    Operasi yang secara otomatis menghapus atau mengubah data pada tabel anak, jika ada perubahan pada tabel induk.

    Contoh Penggunaan  :
    Menggunakan tabel users dan social_media_accounts yang sebelumnya sudah menggunakan referensi CASCADE.

    Tabel users :


    Tabel social_media_accounts :



    INSERT INTO social_media_accounts (user_id, instagram, facebook, linkedin)
    VALUES
        (1, 'andi_pratama', 'andi.pratama.fb', 'andi.pratama.linkedin'),
        (2, 'siti_aisyah', 'siti.aisyah.fb', 'siti.aisyah.linkedin'),
        (3, 'budi_santoso', NULL, 'budi.santoso.linkedin'),
        (4, NULL, 'dewi.lestari.fb', 'dewi.lestari.linkedin'),
        (5, 'fajar_setiawan', 'fajar.setiawan.fb', NULL),
        (6, NULL, NULL, 'rina.amelia.linkedin');

    Sekarang kita akan coba untuk menghapus salah satu data pada tabel users.


    Tabel users setelah melakukan hapus data :


    Data dengan user_id=5 pada social_media_accounts juga terhapus secara otomatis : 


  2. SET NULL
    Berbeda dengan CASCADE, penggunaan SET NULL tidak akan menghapus data (pada tabel anak) tapi akan menjadikan kolom FK (pada tabel anak) menjadi null.

    Sebagai contoh, kita akan membuat tabel baru (units) yang akan berelasi dengan tabel products.



    CREATE TABLE units (
        id SERIAL PRIMARY KEY,
        name VARCHAR(100) NOT NULL,
        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
        updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    );

    Tambahkan kolom unit_id dengan referensi SET NULL pada tabel products.


    Tabel units :



    INSERT INTO units (name)
    VALUES
        ('Kilogram'),
        ('Gram'),
        ('Liter'),
        ('Milliliter'),
        ('Pcs'),
        ('Box');

    Tabel products :



    INSERT INTO products (store_id, name, price, stock, unit_id)
    VALUES
        (1, 'Laptop ASUS ROG', 15000000.00, 10, 1),
        (1, 'Smartphone Samsung Galaxy', 8000000.00, 25, 1),
        (2, 'Headphone Sony WH-1000XM4', 5000000.00, 30, 1),
        (2, 'Smartwatch Apple Watch Series 7', 7000000.00, 15, 1),
        (1, 'Keyboard Logitech G Pro X', 1500000.00, 50, 5),
        (2, 'Mouse Razer DeathAdder Elite', 800000.00, 100, 5);

    Sekarang kita coba untuk hapus salah satu data units.


    Tabel units :


    Tabel products :
    Nilai pada kolom unit_id menjadi null karena data relasinya sudah dihapus.



  3. SET DEFAULT
    Untuk menggunakan SET DEFAULT kita harus menambahkan terlebih dahulu nilai default pada saat pembuatan tabel, atau menggunakan ALTER jika tabelnya sudah ada.

    Sebagai contoh, kita akan menambahkan tabel roles yang akan berelasi dengan tabel users.



    CREATE TABLE roles (
        id SERIAL PRIMARY KEY,
        name VARCHAR(30) NOT NULL,
        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
        updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    );

    Tambahkan kolom role_id pada users.



    ALTER TABLE users
    ADD COLUMN role_id INT REFERENCES roles(id) ON DELETE SET DEFAULT;

    Tambahkan referensi SET DEFAULT untuk kolom role_id.



    ALTER TABLE users
    ALTER COLUMN role_id SET DEFAULT 1;

    Tabel users :


    Tabel roles :


    Update kolom role_id pada tabel user dengan nilai dari tabel roles.


    Hapus data roles :


    Tabel roles seleteh melakukan penghapusan data :


    Tabel users setelah melakukan penghapusan data :
    Teman-teman bisa melihat perbedaan pada kolom role_id. Karena nilai role_id = 3 telah dihapus, semua data dengan nilai 3 secara otomatis diubah menjadi 1.



  4. RESTRICT
    Operasi ini bertujuan untuk mencegah penghapusan data di tabel induk yang masih memiliki hubungan dengan data di tabel anak.

    Sebagai contoh, kita akan membuat tabel baru, yang akan berelasi dengan tabel users menggunakan referensi RESTRICT. 



    CREATE TABLE orders (
        id SERIAL PRIMARY KEY,
        user_id INT REFERENCES users(id) ON DELETE RESTRICT,
        store_id INT REFERENCES stores(id) ON DELETE RESTRICT,
        total_amount DECIMAL(10, 2) NOT NULL,
        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
        updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    );

    Table users :


    Tabel orders :



    INSERT INTO orders (user_id, store_id, total_amount)
    VALUES
        (1, 1, 150000.00),
        (2, 1, 250000.00),
        (3, 2, 100000.00),
        (6, 2, 200000.00),
        (1, 2, 300000.00);

    Hapus data users :
    Temen-temen bisa melihat terjadi error ketika kita menghapus data, hal ini disebabkan karena user dengan id=6 masih memiliki data terkait ditabel orders.


  5. NO ACTION
    Penggunaan NO ACTION mirip seperti RESTRICT, namun perbedaan yang paling utama terletak pada proses menjalankan validasi. Di mana NO ACTION memvalidasi setelah operasi selesai, sedangkan RESTRICT memvalidasi sebelum operasi dijalankan.

    Memahami konsep Reference sangatlah penting dalam pembuatan Database. Dengan memanfaatkan  operasi CASCADE, SET NULL, SET DEFAULT atau RESTRICT, kita dapat mengatur bagaimana data berinteraksi saat terjadi perubahan pada tabel induk.

    Mungkin itu saja yang bisa kita pelajari pada materi kali ini. Semoga materinya dapat membantu teman-teman dalam memahami Konsep Referensi. Jika teman-teman memiliki pertanyaan atau ingin berbagi pengalaman, silakan ketikkan pada kolom komentar di bawah.

Sedikit Tentang Saya :

    Sebagai seorang programmer profesional dengan pengalaman sekitar 4 tahun di bidang IT, saya siap membantu Anda dengan berbagai kebutuhan konsultasi.

Jangan ragu untuk menghubungi saya melalui WhatsApp.

Sampai jumpa di tutorial berikutnya!

Kontak Saya :
Email : ronisurya.115@gmail.com
WhatsApp : 081222821596
Website : Roni Surya

Materi Sebelumnya : Relasi Antar Table

Materi Selanjutnya : Join

Lebih baru Lebih lama