【问题标题】:Postgres - insert with manytoone relationPostgres - 插入多对一关系
【发布时间】:2022-12-18 14:23:39
【问题描述】:

我在用Postgres 14并写一个数据库查询以便我可以在tag 表中插入一个新行:

id team_id name
2 4 London On

就这么简单:

 INSERT INTO tag (team_id, name) SELECT :teamId, :name;

    $stmt->bindValue("teamId", 4, PDO::PARAM_INT);
    $stmt->bindValue("name", 'London On', PDO::PARAM_STR);
    $stmt->bindValue("teamMemberId", 428, PDO::PARAM_STR);

在 tag 表中,我有 ManyToOne 与 team_member_tag 表的关系,应该如下所示:

id team_member_id tag_id
314 428 2

我想在插入 tag 表时将数据的 INSERT 实现到 team_member_tag 表中。我在示例中写了所有需要的参数。

试过:

$stmt = $this->getConnection()->prepare(
        '
            INSERT INTO tag
            (
             team_id,
             name
            ) VALUES (
               :teamId,
               :name,
            ) RETURNING tag.id
            '
    );

    $stmt->executeQuery();

    $stmt2 = $this->getConnection()->prepare('
    INSERT INTO team_member_tag (team_member_id, tag_id)
        VALUES
        ( :workspaceMemberId,
          (select id from tag)
        )
    ');

    $stmt2->bindValue('workspaceMemberId', $workspaceMemberId);
    $stmt2->executeQuery();

现在错误:

违反基数:7 错误:用作表达式的子查询返回多于一行

你能帮忙吗?谢谢

【问题讨论】:

    标签: sql postgresql insert sql-insert


    【解决方案1】:

    这是不正确的语法:

    INSERT INTO team_member_tag (team_member_id, tag_id)
    VALUES
    ( :workspaceMemberId,
      (select id from tag)
    )
    

    因为select id from tag可能会得到很多条记录,但里面的值必须只有一个值。

    要向表中插入多行,您可以使用此语法,例如:

    INSERT INTO team_member_tag (tag_id)
    select id from tag
    

    但是,如果您需要插入到 team_member_tag 表中,只插入标记值,您可以使用以下语法:

    with t1 as (
        INSERT INTO tag (team_id, name) VALUES (:teamId,:name)
        RETURNING id
    ) 
    insert into team_member_tag (team_member_id, tag_id)
    select 10, t1.id from t1
    

    10 - team_member_id 字段的示例值。

    【讨论】:

    • 非常感谢!你的例子做到了。我在语法上苦苦挣扎了很长一段时间.. @RaminFaracov
    猜你喜欢
    • 2017-02-12
    • 1970-01-01
    • 2021-06-30
    • 2015-03-16
    • 2019-04-17
    • 2021-03-09
    • 1970-01-01
    • 1970-01-01
    • 2020-11-11
    相关资源
    最近更新 更多