Refential Integrity di MySQL:InnoDB


Dalam database Referential Integrity diperlukan untuk memastikan bahwa data yang kita masukkan didalam tabel anak yang beralasi foreign key dengan tabel induk benar-benar ada didalam tabel induk. Di MySQL kita dikenal ada beberapa jenis engine yang bisa digunakan sesuai kebutuhan kita dan masing-masing engine memiliki kelebihan dan kekurangan sendiri-sendiri.  InnoDB adalah salah satu mesin(engine) di MySQL yang mulai muncul di versi 3.23.29. Dengan InnoDB kita bisa menerapkan Foreign key dan referential integrity, termasuk juga cascaded delete dan update yang tidak bisa dilakukan di engine MyISAM (mesin default nya).

Untuk dapat menggunakan mesin InnoDB, pastikan dahulu bahwa mesin InnoDB di MySQL Anda tersupport dan tidak dalam keadaan DISABLED. Untuk mengetahui mesin apa saja yang disupport oleh MySQL Anda, lakukan perintah di bawah ini:

mysql> SHOW ENGINES;
+————–+————-+————————————————————+
| Engine      | Support  | Comment   
+————–+————-+————————————————————+
| MyISAM        | DEFAULT    | Default engine as of MySQL 3.23 with great performance
| InnoDB         | DISABLED   | Supports transactions, row-level locking, and foreign keys
| BerkeleyDB    | NO             | Supports transactions and page-level locking     
………….
+————+———+———————————————————–+

12 rows in set (0.00 sec)

Dari hasil perintah show engines, kita dapat mengetahui mesin mana yang disupport oleh database MySQL kita. Pada hasil di atas, mesin InnoDB dalam keadaan DISABLED yang artinya, mesin InnoDB disupport tapi dalam keadaan DISABLED. Untuk dapat menggunakannya kita harus men-enable terlebih dahulu. Untuk meng-enable mesin InnoDB, lakukan tahap-tahap berikut(saya menggunakan MySQL 5.0.51b-community-nt-log MySQL Community Edition (GPL) bawaan sewaktu menginstall AppServ v2.5.10):

  • Buka file my.ini yang terdapat dalam folder instalasi MySQL (C:AppServMySQL – di tempat saya).
  • Cari baris yang berisi skip-innodb (di tempat saya pada line 183)
  • Tambahkan tanda sharp (#) di depan skip-innodb

-> #skip-innodb
tanda # digunakan untuk mendisable baris tersebut sehingga tidak dieksekusi.

  • Simpan file my.ini
  • Restart service MySQL Anda.

Setelah Anda melakukan restart service MySQL, jalankan lagi perintah show engines pada command promt.

mysql> SHOW ENGINES;
+————–+————-+———————————————————+
| Engine         | Support      | Comment                       
+————–+————-+———————————————————+
……
| InnoDB          | YES             | Supports transactions, row-level locking, and foreign keys
| BerkeleyDB     | NO              | Supports transactions and page-level locking       
……
+————+———+———————————————————+
12 rows in set (0.00 sec)

Mesin InnoDB sudah siap digunakan!
Sebagai percobaan, kita dapat melakukan:

C:>mysql -u root -pdaniel
Welcome to the MySQL monitor.  Commands end with ; or g.
Your MySQL connection id is 4
Server version: 5.0.51b-community-nt-log MySQL Community Edition (GPL)

Type ‘help;’ or ‘h’ for help. Type ‘c’ to clear the buffer.

mysql> CREATE DATABASE coba;
Query OK, 1 row affected (0.02 sec)

mysql> USE coba
Database changed

mysql> CREATE TABLE induk (
->  i_id INT NOT NULL,
->  PRIMARY KEY(i_id)
-> ) ENGINE = INNODB;
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE TABLE anak (
->  i_id INT NOT NULL,
->  a_id INT NOT NULL,
->  PRIMARY KEY (i_id, a_id),
->  FOREIGN KEY (i_id) REFERENCES induk (i_id)
->  ON DELETE CASCADE
->  ON UPDATE CASCADE
-> ) ENGINE = INNODB;
Query OK, 0 rows affected (0.02 sec)

mysql> INSERT INTO induk(i_id) VALUES (1),(2);
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM induk;
+——+
| i_id      |
+——+
|    1      |
|    2      |
+——+
2 rows in set (0.00 sec)

mysql> INSERT INTO anak(i_id,a_id) VALUES (1,1),(1,2);
Query OK, 2 rows affected (0.02 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> INSERT INTO anak(i_id,a_id) VALUES (2,1),(2,2);
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM anak;
+——+——+
| i_id | a_id |
+——+——+
|    1 |    1 |
|    1 |    2 |
|    2 |    1 |
|    2 |    2 |
+——+——+
4 rows in set (0.00 sec)

mysql> INSERT INTO anak(i_id,a_id) VALUES (3,1),(3,2);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`coba/anak`, CONSTRAINT `anak_ibfk_1` FOREIGN KEY (`i_id`) REFERENCES `induk` (`i_id`) ON DELETE CASCADE ON UPDATE CASCADE)

mysql> SELECT * FROM anak;
+——+——+
| i_id      | a_id    |
+——+——+
|    1       |    1     |
|    1       |    2     |
|    2       |    1     |
|    2       |    2     |
+——+——+
4 rows in set (0.00 sec)

Selamat Mencoba!

Stop Global Warming!

One thought on “Refential Integrity di MySQL:InnoDB

  1. free000webhosting

    Hello everyone!
    Today I just found this free host with:

    – 350 MB of Disk Space
    – 100 GB Bandwidth
    – Your own domain hosting
    – cPanel Control panel
    – Website Builder
    – Over 500 website templates ready for download
    – Free POP3 Email Box and Webmail access
    – FTP and Web based File Manager
    – PHP, MySQL, Perl, CGI, Ruby.
    – No Ads at all !

    Check it out Here: http://www.000webhost.com/59607.html

    Reply

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s