【问题标题】:Return the id of inserted value with unique id in Postresql在 Postgresql 中返回具有唯一 id 的插入值的 id
【发布时间】:2023-04-02 06:25:01
【问题描述】:

我将数据集插入到具有唯一索引的表中。我需要获取插入值的 id。

 INSERT INTO table_subject_topics_exams (name_of_subject, section, topic, subtopic)
 VALUES 
    ('Algebra', 'Mathematics', 'Progressions', 'Number Sequences'),
    ('Algebra', 'Mathematics', 'Progressions', 'Number sequences'),
    ('Algebra', 'Mathematics', 'Progressions', 'Number sequences'),
    ('Algebra', 'Mathematics', 'Progressions', 'Number sequences'),
    ('Algebra', 'Mathematics', 'Progressions', 'Number sequences'),
    ('Algebra', 'Mathematics', 'Progressions', 'Number sequences'),
    ('Algebra', 'Mathematics', 'Progressions', 'Number sequences'),
    ('Algebra', 'Mathematics', 'Progressions', 'Number sequences'),
    ('Algebra', 'Mathematics', 'Progressions', 'Number sequences'),
    ('Algebra', 'Mathematics', 'Progressions', 'Number sequences'),
    ('Algebra', 'Mathematics', 'Progressions', 'Number sequences'),
    ('Algebra', 'Mathematics', 'Progressions', 'Number sequences'),
    ('Algebra', 'Mathematics', 'Progressions', 'Number sequences'),
    ('Algebra', 'Mathematics', 'Progressions', 'Number sequences'),
    ('Algebra', 'Mathematics', 'Progressions', 'Arithmetic Progression'),
    ('Algebra', 'Mathematics', 'Progressions', 'Arithmetic Progression'),
    ('Algebra', 'Mathematics', 'Progressions', 'Arithmetic Progression'),
    ('Algebra', 'Mathematics', 'Progressions', 'Arithmetic Progression'),
    ('Algebra', 'Mathematics', 'Progressions', 'Geometric Progression'),
    ('Algebra', 'Mathematics', 'Progressions', 'Geometric Progression'),
 ON CONFLICT DO NOTHING returning ids_of_subject_section;

我得到的数据库:

3 "Algebra" "Mathematics" "Progressions" "Number sequences"
33 "Algebra" "Mathematics" "Progressions" "Arithmetic progression"
37 "Algebra" "Mathematics" "Progressions" "Geometric progression"

第一列是 ids 数字。我的目标是得到

3 (12 times)
33 (4 times)
37 (2 times)

我应该如何查询?

【问题讨论】:

    标签: sql postgresql sql-insert


    【解决方案1】:

    使用returning 子句:

    with i as (
          insert into table_subject_topics_exams . . .
          . . .
          returning *  -- or whatever columns you want
         )
    select *
    from i;
    

    Here 是一个 dbfiddle。

    编辑:

    如果您想要所有原始值,则需要将它们放入“表”中并将它们重新连接起来:

    with vals as (
          select *
          from (values ('Algebra', 'Mathematics', 'Progressions', 'Number Sequences'),
                       ('Algebra', 'Mathematics', 'Progressions', 'Number sequences'),
                       . . .
               ) v(name_of_subject, section, topic, subtopic)
         ),
         i as (
          insert into table_subject_topics_exams (name_of_subject, section, topic, subtopic)
              select name_of_subject, section, topic, subtopic
              from vals
              on conflict do nothing
              returning ids_of_subject_section
         )
    select v.*, i.ids_of_subject_section
    from vals join
         i
         using (name_of_subject, section, topic, subtopic);
      
    

    【讨论】:

    • CTE 并不是真正需要的
    • 我把 queery 放在括号里。但它根本不起作用
    • @a_horse_with_no_name 。 . .没错,但我更喜欢将 DML 操作与返回结果分开。
    • @ВладимирКузовкин 。 . .我在返回子句中添加了一个 dbfiddle。
    • 你在表中返回 4 行。但结果我想在表中有存在值的 id
    【解决方案2】:

    此查询对输入执行 INSERT 和 SELECT 以创建聚合:

    WITH i AS (
        SELECT
            * 
        FROM
            (VALUES
                ( 'Algebra', 'Mathematics', 'Progressions', 'Number Sequences' ),
                ( 'Algebra', 'Mathematics', 'Progressions', 'Number sequences' ),
                ( 'Algebra', 'Mathematics', 'Progressions', 'Number sequences' ),
                ( 'Algebra', 'Mathematics', 'Progressions', 'Number sequences' ),
                ( 'Algebra', 'Mathematics', 'Progressions', 'Number sequences' ),
                ( 'Algebra', 'Mathematics', 'Progressions', 'Number sequences' ),
                ( 'Algebra', 'Mathematics', 'Progressions', 'Number sequences' ),
                ( 'Algebra', 'Mathematics', 'Progressions', 'Number sequences' ),
                ( 'Algebra', 'Mathematics', 'Progressions', 'Number sequences' ),
                ( 'Algebra', 'Mathematics', 'Progressions', 'Number sequences' ),
                ( 'Algebra', 'Mathematics', 'Progressions', 'Number sequences' ),
                ( 'Algebra', 'Mathematics', 'Progressions', 'Number sequences' ),
                ( 'Algebra', 'Mathematics', 'Progressions', 'Number sequences' ),
                ( 'Algebra', 'Mathematics', 'Progressions', 'Number sequences' ),
                ( 'Algebra', 'Mathematics', 'Progressions', 'Arithmetic Progression' ),
                ( 'Algebra', 'Mathematics', 'Progressions', 'Arithmetic Progression' ),
                ( 'Algebra', 'Mathematics', 'Progressions', 'Arithmetic Progression' ),
                ( 'Algebra', 'Mathematics', 'Progressions', 'Arithmetic Progression' ),
                ( 'Algebra', 'Mathematics', 'Progressions', 'Geometric Progression' ),
                ( 'Algebra', 'Mathematics', 'Progressions', 'Geometric Progression' ) 
            ) sub ( name_of_subject, section, topic, subtopic ) 
        ),
        dml AS ( 
            INSERT INTO table_subject_topics_exams ( name_of_subject, section, topic, subtopic ) 
            SELECT * 
            FROM i 
            ON CONFLICT 
            DO NOTHING 
            RETURNING * 
    ) 
    SELECT  ids_of_subject_section
        ,   COUNT ( * ) 
    FROM
        i
        LEFT JOIN dml USING ( name_of_subject, section, topic, subtopic ) 
    GROUP BY
        ids_of_subject_section;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-25
      • 1970-01-01
      相关资源
      最近更新 更多