使用随机的2个字符串命名表中的每一行

时间:2012-12-02 23:59:23

标签: php postgresql

我想为数据库中的表选择一个简单的命名约定。

这意味着我必须用随机的2个字符串命名每一行。

例如

ID NAME

1 ROMEL SUMPI

2 BORMI SUIEMOD

依此类推,,,,,,,,,

这意味着每个NAME列都应具有唯一名称.....

如何在使用postgreSQL DB的PHP中执行此操作....

提前谢谢你,。,,,,

2 个答案:

答案 0 :(得分:1)

我怀疑你实际上是指“任意”的唯一名字。简单的方法可能是:

INSERT INTO tbl (id, name)
SELECT g, 'name'::text || g || ' surname' || g
FROM   generate_series(1, 1000) g;

..生成1000个不同的名称 - 根本不是随机的,而是唯一的。

生成由两个单词组成的100个名称,其中包含来自A-Z的3-10个随机字母:

INSERT INTO tbl (id, name)
SELECT g%100
      ,left(string_agg(chr(65 + (random() * 25)::int), ''), 3 + (random() * 7)::int)
       || ' ' ||
       left(string_agg(chr(65 + (random() * 25)::int), ''), 3 + (random() * 7)::int)
FROM   generate_series(1, 1000) g
GROUP  BY 1
ORDER  BY 1;

'A'的ASCII代码是65,'Z'的代码是90.幸运的是,跨越基本大写字母的范围。您可以使用与ascii() function相反的chr()找到:

SELECT ascii('A')

第二种方法并不能保证唯一性,但只有几百个名称,重复的可能性极小。消除可能的重复是微不足道的。在SELECT的位置添加另一个GROUP BY name图层,然后选择min(id)

答案 1 :(得分:1)

听起来您可能想要从词典中随机选择。鉴于这个问题缺乏明确性,这很难说清楚。

随机词典

选择随机字典单词的最佳方法可能是在PHP结束时使用一个为你做的密码生成器。

您可以使用表格dictionary在PostgreSQL中执行此操作,但每行只有一个word

SELECT word FROM dictionary ORDER BY random() LIMIT 2;

使用大型字典,性能将非常糟糕。如果字典没有改变,并且在编号中没有间隙的唯一word_id,可以更快地完成它,允许你写:

CREATE OR REPLACE FUNCTION get_random_word() RETURNS text AS $$
SELECT word FROM dictionary 
WHERE word_id = (
  SELECT width_bucket(random(), 0, 1, (SELECT max(word_id) FROM dictionary))
);
$$ LANGUAGE sql;

SELECT get_random_word() || ' ' || get_random_word();

针对这样的表:

CREATE TABLE dictionary(word_id serial primary key, word text UNIQUE NOT NULL);

如果单词编号中没有间隙且word_id是唯一的或PRIMARY KEY,则只会产生一致的结果。它可以两次生成相同的单词。如果你想避免这种情况,你需要一个递归的CTE或一些PL / PgSQL。

RANDOM GIBBERISH

如果你真的想要真正随机的字符串,那么Stack Overflow上已经很好地介绍了它。见How do you create a random string that's suitable for a session ID in PostgreSQL?等;看看this search

要确保唯一性,只需添加UNIQUE约束即可。进行应用程序测试以查看INSERT行时是否引发了unique_violation,并在发生违规时插入新的随机ID。如果您愿意,可以使用PL / PgSQL帮助程序自动执行此操作,但它仍然会受到不同事务中并发插入之间的竞争。