November 12, 2023 mysql

MySQL : Mengabaikan Error Pada Saat Insert Data ke Database

Error bisa saja terjadi saat insert data ke database, seperti error duplikasi, error tidak boleh null, error key tidak valid, dsb.

Jika muncul error pada saat insert, maka insert akan dibatalkan. Jika data yang di-insert lebih dari satu, maka semuanya akan dibatalkan.

Misal pada tabel users kolom email unik, maka insert dibawah akan muncul error pada VALUES baris ke-tiga karena email-nya duplikat sehingga semua data tidak akan masuk ke database.

INSERT INTO `users`
    (`email`, `name`)
VALUES
    ('ada@gmail.com', 'Ada'),
    ('shev@gmail.com', 'Shev'),
    ('ada@gmail.com', 'Roh'),
    ('jin@gmail.com', 'Jin'),
    ('gamm@gmail.com', 'Gamm');
ERROR 1062 (23000): Duplicate entry 'ada@gmail.com' for key 'email'

Ada beberapa cara untuk mengatasi masalah ini, salah satunya adalah dengan mengabaikan error-nya.

Dengan diabaikannya error, error akan diubah menjadi warning, jika data yang di-insert lebih dari satu maka data yang error akan dilewati, yang tidak error akan tetap disimpan.

Untuk mengabaikannya caranya hanya dengan menambahkan modifier IGNORE setelah INSERT statement.

INSERT IGNORE INTO `users`
    (`email`, `name`)
VALUES
    ('ada@gmail.com', 'Ada'),
    ('shev@gmail.com', 'Shev'),
    ('ada@gmail.com', 'Roh'),
    ('jin@gmail.com', 'Jin'),
    ('gamm@gmail.com', 'Gamm');
Query OK, 4 rows affected, 1 warning (0.002 sec)
Records: 5  Duplicates: 1  Warnings: 1

Hasilnya, dari 5 data yang akan dimasukkan hanya 4 yang tersimpan, 1 error duplikat akan diubah jadi warning dan tidak tersimpan.

Daftar error yang dapat diabaikan:

  • ER_BAD_NULL_ERROR
  • ER_DUP_ENTRY
  • ER_DUP_ENTRY_WITH_KEY_NAME
  • ER_DUP_KEY
  • ER_NO_PARTITION_FOR_GIVEN_VALUE
  • ER_NO_PARTITION_FOR_GIVEN_VALUE_SILENT
  • ER_NO_REFERENCED_ROW_2
  • ER_ROW_DOES_NOT_MATCH_GIVEN_PARTITION_SET
  • ER_ROW_IS_REFERENCED_2
  • ER_SUBQUERY_NO_1_ROW
  • ER_VIEW_CHECK_FAILED

Sumber

https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html#ignore-effect-on-execution