Sql 插入到表中,with子句在postgres中不起作用

Sql 插入到表中,with子句在postgres中不起作用,sql,postgresql,Sql,Postgresql,很抱歉,您的后续问题 但我找不到任何解决问题的办法 我有一个反馈表,其列是其他表的外键。例如,scopeid是scope表中id列的foregin键,类似地,userid是user表中id列的外键,依此类推 因此,我尝试在表中插入以下数据: 经营范围:主页, 用户名:abc 状态:固定 应用程序:demoapp 因此,为了插入上述数据,我尝试编写子查询来获取每个值的id并使用它。此外,如果该值不存在,则插入并使用新ID在反馈表中插入该值 所以基本上,我试图在不存在的情况下插入到多个表中,并使用这

很抱歉,您的后续问题

但我找不到任何解决问题的办法

我有一个反馈表,其列是其他表的外键。例如,scopeid是scope表中id列的foregin键,类似地,userid是user表中id列的外键,依此类推

因此,我尝试在表中插入以下数据: 经营范围:主页, 用户名:abc 状态:固定 应用程序:demoapp

因此,为了插入上述数据,我尝试编写子查询来获取每个值的id并使用它。此外,如果该值不存在,则插入并使用新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我已经更新了我的问题。