使用关联创建或更新批量对象

时间:2017-05-23 14:53:40

标签: sql postgresql

您好我使用INSERTON CONFLICT来创建或更新数据。

示例:

INSERT INTO users(office_id, f_name, l_name)
VALUES
  (1, 'user1_f', 'u1_last'),
  (2, 'user2_f', 'u2_last'),
  (2, 'user3_f', 'u2_last')
ON CONFLICT(office_id, l_name)
DO UPDATE SET
  f_name=EXCLUDED.f_name

但如果用户不存在,我是否可以创建与users相关联的profiles表格?

我的意思是如果我没有冲突,将是

INSERT INTO profiles(user_id, url) VALUES(user_id, 'google.com')user_id将来自创建的用户<{p}}

我不知道是否有可能。谢谢。

1 个答案:

答案 0 :(得分:0)

我通过Postgres WITHhttps://www.postgresql.org/docs/9.6/static/queries-with.html方式解决了这个问题:

WITH new_users AS (
  INSERT INTO users(office_id, f_name, l_name)
  VALUES
    (1, 'user1_f', 'u1_last'),
    (2, 'user2_f', 'u2_last'),
    (2, 'user3_f', 'u2_last')
  ON CONFLICT(office_id, l_name)
  DO UPDATE SET
    f_name=EXCLUDED.f_name
  RETURNING *
), new_user_profile AS (
  INSERT INTO profiles(user_id, created_at, updated_at)
  SELECT id, current_timestamp, current_timestamp FROM new_users
  ON CONFLICT (user_id) DO NOTHING
  RETURNING *
)
SELECT * FROM new_users