postgresql 如何为postgres中的所有行生成随机字符串

pgvzfuti  于 2023-02-18  发布在  PostgreSQL
关注(0)|答案(2)|浏览(379)

我有一个foo表,希望将bar列设置为一个随机字符串。

update foo
set bar = select string_agg(substring('0123456789bcdfghjkmnpqrstvwxyz', round(random() * 30)::integer, 1), '')
          from generate_series(1, 9);

但是它只生成一次随机字符串,然后对所有行重复使用它,我怎样才能使它为每一行生成一个随机字符串呢?
我知道我可以把它变成这样的函数:

create function generate_bar() returns text language sql as $$
  select string_agg(substring('0123456789bcdfghjkmnpqrstvwxyz', round(random() * 30)::integer, 1), '')
  from generate_series(1, 9)
$$;

然后在更新查询中调用函数,但是我更喜欢不使用函数。

oyxsuwqo

oyxsuwqo1#

问题是Postgres优化器太聪明了,它决定对所有行只执行一次子查询,它确实忽略了一些明显的东西--random()函数使子查询 volatile,因此这不是适当的行为。
解决这个问题的一个方法是使用相关子查询。下面是一个示例:

update foo
    set bar = array_to_string(array(select string_agg(substring('0123456789bcdfghjkmnpqrstvwxyz', round(random() * 30)::integer, 1), '')
                                    from generate_series(1, 9)
                                    where foo.bar is distinct from 'something'
                                   ), '');

Here是db〈〉小提琴。

wztqucjr

wztqucjr2#

对于最多包含32个字符的随机混合大小写数字字符串,请用途:

UPDATE "foo" SET "bar"= substr(md5(random()::text), 0, XXX);

并将XXX替换为所需字符串的长度加1。要将所有字符串替换为长度为32的字符串,示例:

UPDATE "foo" SET "bar"= substr(md5(random()::text), 0, 33);

14235ccd21a408149cfbab0a8db19fb2可能是填充其中一行的值。每行将有一个随机字符串,但不保证唯一。

用于生成超过32个字符的字符串

只需将上述内容与CONCAT结合起来即可

相关问题