我的所有表都使用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并存储以供下次插入?
答案 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 $$;
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 $$;