【问题标题】:PostgreSQL: Column DEFAULT gen_random_bytes UNIQUEPostgreSQL:列默认 gen_random_bytes 唯一
【发布时间】:2017-06-19 14:40:13
【问题描述】:

假设我们有下表:

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

【问题讨论】:

    标签: postgresql random unique default


    【解决方案1】:
    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
    

    【讨论】:

    • 抱歉,问题可能不太清楚。我们只想插入一行。
    • @mattdipasquale:新答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-01
    • 1970-01-01
    • 2023-04-01
    • 2015-02-05
    • 1970-01-01
    • 2018-07-09
    相关资源
    最近更新 更多