Search Postgresql Archives

Re: connecting multiple INSERT CTEs to same record?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 2021-10-19 1:13 p.m., David G. Johnston wrote:

Instead of assigning a unique identifier to student after inserting it into the table, assign the identifier first.  Generally this is done by using “nextval()”

Aha! Such elegant solution!

Seems obvious in hindsight, but I just couldn't figure it out nor find
any mentions to it online.

For others who might stumble upon this thread in the future,
the solution becomes:

====

 with
   -- pre-assign unique IDs for each record,
   -- without inserting them to the table yet.
   new_data_with_ids as (
     select
       nextval(pg_get_serial_sequence('students','id'))
            as new_student_id,
       new_data.*
     from new_data )
   ,

   -- Now insert the new names, with their pre-assigned IDs
   new_students as (
       insert into students(id,name)
       select new_student_id, name
       from new_data_with_ids
       returning * -- optional
       )
   ,

   -- And use the IDs for other tables, too
   new_classes as (
      insert into classes(student_id, subject)
      select new_student_id, subject
      from new_data_with_ids
      returning * --optional
   )

 -- return the new IDs with the data
 select * from new_data_with_ids ;

===

Thank you!

Regards,
 - Assaf Gordon






[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Postgresql Jobs]     [Postgresql Admin]     [Postgresql Performance]     [Linux Clusters]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Databases]     [Postgresql & PHP]     [Yosemite]

  Powered by Linux