0

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

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

例如

身份证名称

1 ROMEL SUMPI

2 博米苏伊莫德

等等,,,,,,,,,

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

我如何在使用 postgreSQL DB 的 PHP 中做到这一点......

先感谢您,,。,,,,

4

2 回答 2

1

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

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

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

要生成 100 个由 AZ 中包含 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()你可以用函数找出来,它的反面是chr()

SELECT ascii('A')

第二种方法不能保证唯一性,但只有几百个名字就不太可能出现重复。消除可能的重复项是微不足道的。SELECT在您GROUP BY name选择的位置添加另一层min(id)

于 2012-12-03T00:06:05.877 回答
1

听起来您可能想要一对从字典中随机选择的单词。鉴于问题不明确,这很难说。

随机字典单词

选择随机字典单词的最佳方法可能是在 PHP 端使用为您执行此操作的密码短语生成器。

但是,您可以在 PostgreSQL 中使用每行一个表来执行此dictionary操作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);

只有在单词编号中没有间隙并且 if word_idis unique 或PRIMARY KEY. 它可以产生两次相同的单词。如果您想避免这种情况,您将需要递归 CTE 或一些 PL/PgSQL。

随机胡言乱语

如果您真的想要真正的随机字符串,Stack Overflow 已经很好地介绍了这一点。请参阅如何在 PostgreSQL 中创建适合会话 ID 的随机字符串?除其他外;看看这个搜索

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

于 2012-12-03T00:07:00.040 回答