Javan Cipta Solusi
Published in

Javan Cipta Solusi

ERROR : numeric field overflow

PostgreSQL Numeric Field Overflow

Di manual PostgreSQL, ada hal menarik yang rasanya wajib untuk dipahami tentang Numeric Types.

Ketika kita membuat suatu table dengan tedapat tipe data numeric menggunakan perintah di bawah ini :

CREATE TABLE test (id numeric(4, 2) NOT NULL,description character varying(250),reg_date timestamp without time zone);

kemudian mencoba untuk melakukan insert data dengan perintah di bawah ini :

INSERT INTO test(id, description, reg_date)VALUES (123, 'testing numeric types', now());

Maka hasilnya adalah ERROR!!!

ERROR:  numeric field overflowDETAIL:  A field with precision 4, scale 2 must round to an absolute value less than 10^2.

Sedikit membingungkan jika kita baca dari error description-nya ya? mari kita baca penjelasan dari manual PostgreSQL.

The scale of a numeric is the count of decimal digits in the fractional part, to the right of the decimal point. The precision of a numeric is the total count of significant digits in the whole number, that is, the number of digits to both sides of the decimal point. So the number 23.5141 has a precision of 6 and a scale of 4. Integers can be considered to have a scale of zero.

Pada intinya scale adalah jumlah digit angka di belakang koma (jumlah digit desimal) dan precision adalah jumlah digit angka secara keseluruhan di kedua sisi.

NUMERIC(precision, scale)

Jadi, perintah insert data di atas tadi menghasilkan error karena pada aktualnya postgreSQL mengeksekusi nilai id menjadi 123.00 dari yang kita inputkan 123. Penjelasannya :

  • didefinisikan pada table test untuk kolom id adalah numeric(4, 2)
  • scale = 2, untuk kasus ini mengakibatkan angka dibelakang koma ditambahkan secara default 2 digit angka yaitu .00
  • jumlah ketepatan (precision) = 5 dihitung dari jumlah keseluruhan digit angka 1, 2, 3, 0 dan 0
  • sedangkan kolom id pada table test precision yang didefinisikan adalah 4, kesalahan inilah yang mengakibatkan error : numeric field overflow

Contoh query yang benar untuk contoh kasus ini :

INSERT INTO test(id, description, reg_date)VALUES (1, 'testing numeric types #1', now());
INSERT INTO test(id, description, reg_date)VALUES (12, 'testing numeric types #2', now());
Query returned successfully: one row affected, 43 ms execution time.

Yups, sekarang paham kan? semoga dapat membantu jika terjadi error serupa nanti.

--

--

Business Process Optimization Partner. Contact us to help you optimize your business using technology.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store