postgreSQL uuid代

bar*_*rit 11 sql database postgresql

select uuid_generate_v4() as one, uuid_generate_v4() as two;
Run Code Online (Sandbox Code Playgroud)

"一个"uuid和"两个"uuid是平等的!

CREATE TABLE "TB"
(
  "Id" uuid NOT NULL DEFAULT uuid_generate_v4(),
  "Title" character varying NOT NULL,
   CONSTRAINT "TB_Class_ID" PRIMARY KEY ("Id")
);
Run Code Online (Sandbox Code Playgroud)

postgresql 9.0 pgAdmin 1.12.3

insert into "TB" ("Id", "Title") values (uuid_generate_v4(), '111');
insert into "TB" ("Id", "Title") values (uuid_generate_v4(), '111');
insert into "TB" ("Id", "Title") values (uuid_generate_v4(), '111');
Run Code Online (Sandbox Code Playgroud)

要么

insert into "TB" ("Title") values ('111');
insert into "TB" ("Title") values ('111');
insert into "TB" ("Title") values ('111');
Run Code Online (Sandbox Code Playgroud)

结果:

ERROR:  duplicate key value violates unique constraint "TB_Class_ID"
DETAIL:  Key ("Id")=(12ab6634-995a-4688-9a9a-ee8c3fe24395) already exists.
Run Code Online (Sandbox Code Playgroud)

postgreSQL maestro 9.2.0.4

insert into "TB" ("Id", "Title") values (uuid_generate_v4(), '111');
insert into "TB" ("Id", "Title") values (uuid_generate_v4(), '111');
insert into "TB" ("Id", "Title") values (uuid_generate_v4(), '111');
Run Code Online (Sandbox Code Playgroud)

结果:1行受影响;

我知道maestro一个接一个地添加了记录,但为什么uuid_generate_v4()在两次调用后返回相同的值?(在pgAdmin案例中).

如何通过一个请求添加多行?

Pet*_*aut 13

在过去的某个时刻,uuid_generate_*函数被错误地标记为IMMUTABLE,这将导致您显示的行为.这已在所有最新的次要版本中修复,但您必须重新运行安装脚本(uuid-ossp.sql)以获取更新的函数定义.(您还可以查看安装脚本以验证您是否拥有最新版本.应标记这些功能VOLATILE.)


Boh*_*ian 12

在给定的事务中,该函数uuid_generate_v4()返回相同的值.

当语句组合在一起并作为"一个命令"运行时,有一个事务,因此每次调用都uuid_generate_v4()将返回相同的值.

"修复"这两种方法是:

  1. 每次使用该函数时都进行单独的数据库调用(这是最简单的)
  2. 使用非自动提交连接来控制事务并分离一BEGIN; COMMIT对中的每个用法(这是一个麻烦 - 除非必须,否则不要这样做)

  • 对于所有从谷歌或其他地方来过这里的人来说,仅供参考,但我不认为这是一个错误或问题."选择uuid_generate_v4()作为一个,uuid_generate_v4()为两个"在我的PostgreSQL 9.3/9.4安装中正常工作.就像@ peter-eisentraut所说,这可能是一段时间后被修复的错误. (5认同)

Puz*_*rki 5

为了避免重复,您可以使用如下生成:

select md5(random()::text || clock_timestamp()::text)::uuid AS new_id, id from table;
Run Code Online (Sandbox Code Playgroud)

但是,请注意:这会生成 UUID,但它不是 UUIDv4。查看更多:在 Postgres 中为 Insert 语句生成 UUID?