我想为我的数据库中的表选择一个简单的命名约定。
这意味着我必须用随机的 2 个单词字符串命名每一行。
例如
身份证名称
1 ROMEL SUMPI
2 博米苏伊莫德
等等,,,,,,,,,
这意味着每个 NAME 列都应该有一个唯一的名称.....
我如何在使用 postgreSQL DB 的 PHP 中做到这一点......
先感谢您,,。,,,,
我想为我的数据库中的表选择一个简单的命名约定。
这意味着我必须用随机的 2 个单词字符串命名每一行。
例如
身份证名称
1 ROMEL SUMPI
2 博米苏伊莫德
等等,,,,,,,,,
这意味着每个 NAME 列都应该有一个唯一的名称.....
我如何在使用 postgreSQL DB 的 PHP 中做到这一点......
先感谢您,,。,,,,
我怀疑您实际上是指“任意”的唯一名称。简单的方法可能是:
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)
。
听起来您可能想要一对从字典中随机选择的单词。鉴于问题不明确,这很难说。
选择随机字典单词的最佳方法可能是在 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_id
is unique 或PRIMARY KEY
. 它可以产生两次相同的单词。如果您想避免这种情况,您将需要递归 CTE 或一些 PL/PgSQL。
如果您真的想要真正的随机字符串,Stack Overflow 已经很好地介绍了这一点。请参阅如何在 PostgreSQL 中创建适合会话 ID 的随机字符串?除其他外;看看这个搜索。
为确保唯一性,只需添加一个UNIQUE
约束。让您的应用程序测试以查看在您INSERT
编辑该行时是否引发了 unique_violation,如果发生违规,则使用新的随机 ID 插入它。如果您愿意,您可以使用 PL/PgSQL 帮助程序自动执行此操作,尽管它仍然会受到不同事务中并发插入之间的竞争的影响。