我想为数据库中的表选择一个简单的命名约定。
这意味着我必须用随机的2个字符串命名每一行。
例如
ID NAME
1 ROMEL SUMPI
2 BORMI SUIEMOD
依此类推,,,,,,,,,
这意味着每个NAME列都应具有唯一名称.....
如何在使用postgreSQL DB的PHP中执行此操作....
提前谢谢你,。,,,,
答案 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。
如果你真的想要真正随机的字符串,那么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帮助程序自动执行此操作,但它仍然会受到不同事务中并发插入之间的竞争。