CREATE SEQUENCE public.global_id_seq; ALTER SEQUENCE public.global_id_seq OWNER TO postgres; CREATE OR REPLACE FUNCTION public.id_generator() RETURNS bigint LANGUAGE 'plpgsql' AS $BODY$ DECLARE our_epoch bigint := 1314220021721; seq_id bigint; now_millis bigint; -- the id of this DB shard, must be set for each -- schema shard you have - you could pass this as a parameter too shard_id int := 1; result bigint:= 0; BEGIN SELECT nextval('public.global_id_seq') % 1024 INTO seq_id; SELECT FLOOR(EXTRACT(EPOCH FROM clock_timestamp()) * 1000) INTO now_millis; result := (now_millis - our_epoch) << 23; result := result | (shard_id << 10); result := result | (seq_id); return result; END; $BODY$; ALTER FUNCTION public.id_generator() OWNER TO postgres; create schema shard_1 create table users( id bigint not null default id_generator(), email varchar(255) not null unique, first varchar(50), last varchar(50) ); -- select id_generator();