Kadang-kadang, kita perlu mengumpulkan data dari beberapa user yang tidak terhubung dengan jaringan komputer (LAN/Internet). Sedangkan data dari user tersebut menggunakan field id (BIGSERIAL) sebagai ID uniknya. Namun masalah timbul jika ada beberapa data yang ID-nya sama dari user yang berbeda. Bila di-merge, data-data akan saling timpa atau menimbulkan error “Duplicate Key Violation”.
Untuk mengatasi ini, saya perlu trik lain selain AutoIncrement field (BIGSERIAL di PostgreSQL) dan membuat sebuah stored function baru, gen_pid().
Isi deklarasi stored function ini seperti berikut.
-- Function: gen_pid()-- DROP FUNCTION gen_pid();CREATE OR REPLACE FUNCTION gen_pid()RETURNS character varying AS$BODY$DECLARE thn varchar;DECLARE bln varchar;DECLARE tgl varchar;DECLARE jam varchar;DECLARE min varchar;DECLARE mis varchar;beginthn := extract(year from current_timestamp)::varchar;bln := extract(month from current_timestamp)::varchar;tgl := extract(day from current_timestamp)::varchar;jam := extract(hour from current_timestamp)::varchar;min := extract(minute from current_timestamp)::varchar;mis := extract(microseconds from current_timestamp)::varchar;if length(bln)<2 then bln:='0'||bln; end if;if length(tgl)<2 then tgl:='0'||tgl; end if;if length(jam)<2 then jam:='0'||jam; end if;if length(min)<2 then min:='0'||min; end if;while length(mis)<9loopmis:='0'||mis ;end loop;return (thn||bln||tgl||jam||min||mis)::varchar;end;$BODY$LANGUAGE 'plpgsql' VOLATILECOST 100;ALTER FUNCTION gen_pid() OWNER TO postgres;
Bila sudah jadi, saya dapat memanggilnya dengan
select 'Nomor Unik: ' || gen_pid();
fungsi ini dapat juga digunakan sebagai nilai default field pengganti nilai default untuk field ID:
CREATE TABLE transaksi_details(nama character varying(50) NOT NULL,id character varying(21) NOT NULL DEFAULT gen_pid(),CONSTRAINT pk_trans_details PRIMARY KEY (id))WITH (OIDS=FALSE);ALTER TABLE transaksi_details OWNER TO postgres;
Berikut contoh inputan data yang dibuat dengan Data Definition Language (DDL) di atas:
Semoga bermanfaat.
Tidak ada komentar:
Posting Komentar