带有UUID的PostgreSQL中的变量

时间:2015-10-06 04:38:33

标签: sql postgresql variables

我的所有表都使用UUID主键。我想在一个sql文件中填充带有测试数据的表,但不能在其他表中使用UUID PK作为FK,因为默认函数uuid_generate_v4()在执行期间会生成一个随机值。

我想要的例子:

SET Uservar = uuid_generate_v4();
SET Postvar = uuid_generate_v4();

INSERT INTO public."User" (id, name) VALUES (Uservar, 'Foo Bar');
INSERT INTO public."Post" (id, content, userId) VALUES (Postvar, 'Test message', Uservar)

怎么做?或者如何选择已创建的UUID并存储以供下次插入?

3 个答案:

答案 0 :(得分:0)

当您将INSERT组合成一个语句时,您可以非常轻松地重复使用uuid值:

WITH newUser(id uuid) AS (
  INSERT INTO public."User" (id, name)
  VALUES (uuid_generate_v4(), 'Foo Bar')
  RETURNING id
)
INSERT INTO public."Post" (id, content, userId)
  SELECT uuid_generate_v4(), 'Test message', id
  FROM newUser;

如果要为现有用户添加帖子,可以使用非常类似的方法:

INSERT INTO public."Post" (id, content, userId)
  SELECT uuid_generate_v4(), 'Test message', id
  FROM public."User"
  WHERE name = 'Foo Bar';

当PK自动生成时(即id uuid PRIMARY KEY DEFAULT uuid_generate_v4()),这也会有效,但是你不会在INSERT语句中明确包含PK列。

答案 1 :(得分:0)

例如说你有这样的桌子:

create table my_table(uuid_column uuid PRIMARY KEY NOT NULL);

您可以像这样插入变量化的uuid:

DO $$
DECLARE
    my_uuid uuid = uuid_generate_v4();
BEGIN
    insert into my_table (uuid_column) values (my_uuid);
    select * from my_table where uuid_column = my_uuid;
END $$;

选中this documentation

Nb (要使用uuid_generate_v4()),请确保在使用前先将以下片段删除:

 CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

答案 2 :(得分:0)

我无法发表评论

应该是

DO $$
DECLARE
    my_uuid uuid := uuid_generate_v4();
BEGIN
    insert into my_table (uuid_column) values (my_uuid);
    select * from my_table where uuid_column = my_uuid;
END $$;