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没有像你所注意到的那样工作。你必须使用临时表来实现你想要的