Muhammad Hafid

Blog Belajar Python atau Django

Muhammad Hafid

Tugas kita itu adalah bukan untuk berhasil, tugas kita adalah untuk mencoba, karena di dalam mencoba itulah kita menemukan dan belajar membangun kesempatan untuk berhasil.

Error Null value in column ID violates not-null constraint

Pernah kah kalian mendapatkan error seperti pada judul diatas ? Kali ini saya akan membahas mengenai solve problem jika kalian kedapatakn error tersebut.


Tidak terlalu penting saya menggunakan framework apa, tetapi disini muncul pada saat saya menggunakan framework FeathersJs + postgreSQL.

Error lengkapnya adalah seperti dibawah ini :
info: Feathers application started on localhost:3232
info: error: users - Method: create: null value in column "id" violates not-null constraint
error:  SequelizeDatabaseError: null value in column "id" violates not-null constraint
    at Query.formatError (/home/hafid/Workspace/jsDev/lessons/backend/node_modules/sequelize/lib/dialects/postgres/query.js:351:16)
    at query.catch.err (/home/hafid/Workspace/jsDev/lessons/backend/node_modules/sequelize/lib/dialects/postgres/query.js:86:18)
    at tryCatcher (/home/hafid/Workspace/jsDev/lessons/backend/node_modules/bluebird/js/release/util.js:16:23)
    at Promise._settlePromiseFromHandler (/home/hafid/Workspace/jsDev/lessons/backend/node_modules/bluebird/js/release/promise.js:512:31)
    at Promise._settlePromise (/home/hafid/Workspace/jsDev/lessons/backend/node_modules/bluebird/js/release/promise.js:569:18)
    at Promise._settlePromise0 (/home/hafid/Workspace/jsDev/lessons/backend/node_modules/bluebird/js/release/promise.js:614:10)
    at Promise._settlePromises (/home/hafid/Workspace/jsDev/lessons/backend/node_modules/bluebird/js/release/promise.js:689:18)
    at Async._drainQueue (/home/hafid/Workspace/jsDev/lessons/backend/node_modules/bluebird/js/release/async.js:133:16)
    at Async._drainQueues (/home/hafid/Workspace/jsDev/lessons/backend/node_modules/bluebird/js/release/async.js:143:10)
    at Immediate.Async.drainQueues (/home/hafid/Workspace/jsDev/lessons/backend/node_modules/bluebird/js/release/async.js:17:14)
    at runCallback (timers.js:781:20)
    at tryOnImmediate (timers.js:743:5)
    at processImmediate [as _immediateCallback] (timers.js:714:5)
Fokus terhadap pesan error yang dicetak tebal. Disana menandakan bahwa field Id didefinisikan di postgreSQLnya adalah Primary Key dan Integer, tetapi dipostgresSQLnya pun diberi "Not Null" artinya tidak boleh kosong.

Coba dibayangkan sejenak Tipe data integer dan berstatus primary key tetapi tidak Null. 
Nah jika kita lihat dari sisi framework bearti logika adalah kita harus mencari sendiri nilai untuk mengisi field Id tersebut yang bersifat primary key, bisa saja dengan cara membaca nilai yang belum pernah dituliskan atau dengan cara mencari nilai Max dari nilai akhir yang sudah ada, tetapi itu menurut saya ribet men.!

Oke caranya adalah daripada kalian mengutak atik framework kalian lebih baik kalian perbaiki struktur field nya :
  1. Disarankan lebih baik tipe yang hendak dijadikan primary key adalah integer, walaupun char sekalipun bisa di jadikan primary key
  2. Jika tipe nya primary key, disarankan Not Null, alias harus terisi, bukan bernilai Nol loh ya
  3. Jangan gunakan tipe data Serial, tipe data ini dikenal oleh postgreSQL
  4. Buatlah Constraint Field seperti pada contoh saya dibawah ini :

Oke sekarang mari kita lanjutkan, apabila kalian sudah membuat constraint lalu bagaimana menghubungkannya ke tabel yang bersangkutan ? Disini saya membuat constrain dengan nama users_id_seq, saya namakan seperti itu supaya saya lebih mudah memainten fieldnya bahwa constrain tersebut milik tabel users. Sekarang mari perhatikan gambar dibawah ini :


Nah jika kondisi field didalam sebuah tabel seperti itu, bearti field tersebut sudah memiliki constraint. Lalu bagaimana caranya ?? kalian cukup alter field kalian seperti dibawah ini :

kalian ketikan ini : 
nextval('namaconstraint'::regclass)
Kalian save dan coba kalian jalankan, cara ini lebih baik ketimbang kita menggunakan tipe data SERIAL.

Back To Top