Postgresql 在创建依赖外键行的行的同时创建外键行?

Postgresql 在创建依赖外键行的行的同时创建外键行?,postgresql,Postgresql,您好,我希望能够自动创建所有相关行,这些行依赖于我要插入的行。例如: CREATE TABLE application ( id SERIAL PRIMARY KEY, created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(), client_id VARCHAR(50) NOT NULL UNIQUE ); CREATE TABLE user ( id SERIAL PRIMARY KEY, creat

您好,我希望能够自动创建所有相关行,这些行依赖于我要插入的行。例如:

CREATE TABLE application (
    id SERIAL PRIMARY KEY,
    created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
    client_id VARCHAR(50) NOT NULL UNIQUE    
);

CREATE TABLE user (
    id SERIAL PRIMARY KEY,
    created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
    username VARCHAR(50) NOT NULL UNIQUE
);

CREATE TABLE access_token (
    id SERIAL PRIMARY KEY,
    created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
    token VARCHAR(50) NOT NULL UNIQUE,
    user_id INTEGER REFERENCES user(id),
    application_id INTEGER REFERENCES application(id)
);

CREATE TABLE profile (
    id SERIAL PRIMARY KEY,
    created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
    nickname VARCHAR(50) NOT NULL,
    user_id INTEGER REFERENCES user(id),
    application_id INTEGER REFERENCES application(id)
);

-- The application will already exist
INSERT INTO application (client_id) VALUES ('9fe9bae2b3ba4041a0a24e3c863129eb');
我想在
profile
表中插入一行。为此,我必须1)查找应用程序的FK(我只有
客户端id
),2)为
用户
访问令牌
插入新行。用户和访问令牌将始终插入,它们将不存在

最后,我想返回profile.id、profile.昵称、profile.created\u At、application.client\u id、access\u token.token

我正在尝试构造,但在使其工作时遇到问题,不断出现错误

我试过:

WITH APPLICATION AS (
    SELECT id, client_id FROM ben_application WHERE client_id = '9fe9bae2b3ba4041a0a24e3c863129eb'
), "USER" AS (
    INSERT INTO ben_user (username) VALUES ('ben') RETURNING id
), ACCESS_TOKEN AS (
    INSERT INTO ben_access_token (token, user_id, application_id) VALUES ('token', "USER".id, APPLICATION.id) RETURNING token
)
INSERT INTO ben_profile (nickname, user_id, application_id) VALUES ('Ben W', "USER".id, APPLICATION.id)
RETURNING id, nickname, created_at, APPLICATION.client_id, ACCESS_TOKEN.token;
这就是错误:

ERROR:  missing FROM-clause entry for table "USER"
LINE 6: ...(token, user_id, application_id) VALUES ('token', "USER".id,...
我觉得我走在了正确的轨道上,但考虑到这一点还远远不够。感谢您的帮助


这是PostgreSQL server 11.9

正如错误消息所说,您在子句中缺少一个
,因此在第二个
插入中缺少一个
选择

INSERT INTO ben_access_token (...)
SELECT ..., "USER".id, ... FROM "USER";

USER
是保留字,请参见此处。要么改变这个名字,要么引用它。@AdrianKlaver啊,谢谢!请参见编辑,我已经修复了保留字错误,但得到了一些新的东西为什么不简单地使用多个语句?我看不出为什么创建一个配置文件应该给用户一个访问令牌。你的问题是,当你在你的CTE中运行时,isnert没有完成,所以你的constraint没有像你所注意到的那样工作。你必须使用临时表来实现你想要的