2013-07-07 43 views
1

我想實現的Instagram的UUID,他們在這篇文章中談到:http://instagram-engineering.tumblr.com/post/10853187575/sharding-ids-at-instagramInstragram的UUID創建失敗

我的實現看起來是這樣的:

CREATE OR REPLACE FUNCTION engagement.next_id(OUT result bigint) AS $$ 
DECLARE 
    our_epoch bigint := 1314220021721; 
    seq_id bigint; 
    now_millis bigint; 
    shard_id int := 5; 
BEGIN 
    SELECT nextval('engagement.table_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); 
END; 
$$ LANGUAGE PLPGSQL; 

但我不斷收到此錯誤:

Warning: pg_execute(): Query failed: ERROR: relation "engagement.table_id_seq" does not exist LINE 1: SELECT nextval('engagement.table_id_seq') %% 1024^QUERY: SELECT nextval('engagement.table_id_seq') %% 1024 CONTEXT: PL/pgSQL function next_id() line 8 

我實際上是否想創建一個名爲table_id_seq或不同的表?

回答

1

只需創建序列

create sequence engagement.table_id_seq 

如果你不具備的Instagram的64位UUID尺寸限制,你可以使用更簡單的PostgreSQL的uuid_generate_v1mc()。 postgresql類型是128位長。

create table t (id serial, uid uuid); 

insert into t (uid) 
select uuid_generate_v1mc() 
from generate_series(1, 100000); 

它是由創建時間排序:

select * 
from (
    select 
     *, 
     row_number() over(order by uid) rn 
    from t 
    order by id 
) s 
where id != rn; 
+1

爲什麼Instangram有一個大小的限制 - 如果它們有更大的UID,那麼數據庫查詢的運行速度不夠快? – JoeTidee