Sql 插入到表中,with子句在postgres中不起作用
很抱歉,您的后续问题 但我找不到任何解决问题的办法 我有一个反馈表,其列是其他表的外键。例如,scopeid是scope表中id列的foregin键,类似地,userid是user表中id列的外键,依此类推 因此,我尝试在表中插入以下数据: 经营范围:主页, 用户名:abc 状态:固定 应用程序:demoapp 因此,为了插入上述数据,我尝试编写子查询来获取每个值的id并使用它。此外,如果该值不存在,则插入并使用新ID在反馈表中插入该值 所以基本上,我试图在不存在的情况下插入到多个表中,并使用这些ID插入到最终的表中,即反馈表中 希望事情现在清楚多了 这是我的反馈表:Sql 插入到表中,with子句在postgres中不起作用,sql,postgresql,Sql,Postgresql,很抱歉,您的后续问题 但我找不到任何解决问题的办法 我有一个反馈表,其列是其他表的外键。例如,scopeid是scope表中id列的foregin键,类似地,userid是user表中id列的外键,依此类推 因此,我尝试在表中插入以下数据: 经营范围:主页, 用户名:abc 状态:固定 应用程序:demoapp 因此,为了插入上述数据,我尝试编写子查询来获取每个值的id并使用它。此外,如果该值不存在,则插入并使用新ID在反馈表中插入该值 所以基本上,我试图在不存在的情况下插入到多个表中,并使用这
id scopeid comment rating userid statusid appid
3 1 test 5 2 1 2
所有id列都是其他表的外键,因此在我下面的查询中,我尝试按名称获取id,如果不存在,则添加这些id
这是我的最后一个问题:
INSERT INTO feedbacks (scopeid, comment, rating, userid, statusid, appid)
VALUES
(
-- GET SCOPE ID
(
WITH rows_exists AS (
SELECT id FROM scope
WHERE appid=2 AND NAME = 'application'),
row_new AS (INSERT INTO scope (appid, NAME) SELECT 2, 'application' WHERE NOT EXISTS (SELECT id FROM scope WHERE appid=2 AND name='application') returning id)
SELECT id FROM rows_exists UNION ALL SELECT id FROM row_new
),
-- Comment
'GOD IS HERE TO COMMENT',
-- rating
5,
-- userid
(
WITH rows_exists AS (
SELECT id FROM users
WHERE username='abc'),
row_new AS (INSERT INTO users (username) SELECT 'abc' WHERE NOT EXISTS (SELECT id FROM users WHERE username='abc') returning id)
SELECT id FROM rows_exists UNION ALL SELECT id FROM row_new
),
-- statusid
(SELECT id FROM status WHERE NAME='received'),
-- appid
(
WITH rows_exists AS (
SELECT id FROM apps
WHERE name='google'),
row_new AS (INSERT INTO apps (name) SELECT 'google' WHERE NOT EXISTS (SELECT id FROM apps WHERE NAME='google') returning id)
SELECT id FROM rows_exists UNION ALL SELECT id FROM row_new
)
)
但我得到以下错误:
包含数据修改语句的with子句必须位于顶层
这就是我试图通过这种方式或其他方法实现的目标。以下插入不存在的id,然后插入生成的id:
with s as (
select id
from scope
where appid = 2 AND NAME = 'application'
),
si as (
insert into scope (appid, name)
select v.appid, v.name
from (values (2, 'application')) v(appid, name)
where not exists (select 1 from scope s where s.appid = v.appid and s.name = v.name)
returning id
),
. . . similar logic for other tables
insert into feedback (scopeid, comment, . . . )
select (select id from s union all select id from is) as scopeid,
'test' as comment,
. . .;
您应该确保在每个表中对要查找的值都有唯一的约束。否则,您可能会遇到竞争条件,并最终在多线程环境中多次插入同一行。错误似乎很明显。如果CTE是查询中的第一个CTE,则只能在CTE中使用insert。是否要在示例_表id中查找类似此insert的内容,名称选择1,“John”如果不存在,请从示例_表中选择id,其中id=1@GordonLinoff那么,这是否意味着不可能编写上述查询?这是一个令人困惑的查询。你想干什么?插入到反馈中还是多个插入到其他表中?范围、用户、状态和应用程序如何关联?请备份并更全面地描述您的产品。@Parfait我已经更新了我的问题。