2017-06-19 35 views
0

比方說,我們有如下表:PostgreSQL的:列默認gen_random_bytes UNIQUE

CREATE TABLE foo (
    column_1 bigint, 
    column_2 bytea DEFAULT gen_random_bytes(2), 
    PRIMARY KEY (column_1, column_2) 
); 

注:我們希望column_2是隨機&強加密。

我們如何在不引起主鍵衝突的情況下插入一行?

我想我們必須做一個循環,直到gen_random_bytes(2)返回一個唯一的結果?如果是這樣,我們可以用純粹的SQL做這個循環,也許用遞歸CTE,而不是用plpgsql

回答

0
insert into t (col1, col2) 
select 1, ('\x' || right('000' || to_hex(i), 4))::bytea 
from (
    select generate_series(0, 65535) i 
    except 
    select get_byte(col2, 0) * 256 + get_byte(col2, 1) 
    from t 
    where col1 = 1 
) s 
order by random() 
limit 1 
+0

對不起,也許問題不清楚。我們只想插入一行。 – ma11hew28

+0

@mattdipasquale:新的答案 –