从一个表插入数据,然后获取该插入的主键并将其放入另一个表中

Dar*_*ain 3 postgresql

我有一个快速的问题。我有一个表用户

 -----------------------------
| ID | first_name | last_name |
 -----------------------------
Run Code Online (Sandbox Code Playgroud)

和另一个表,如 users.login

 ------------------
| users_ID | EMAIL |
 ------------------
Run Code Online (Sandbox Code Playgroud)

我在第一个表中的 id 从某个点自动递增,比如 160,000。如何从第一个表中获取 id,将其保存为一个值,然后将该值放入第二个表的 id 中?users.login 中的 id 是 users.id 的外键。

到目前为止我有

INSERT INTO public.users (first_name, last_name)
                VALUEs ($1,$2) RETURNING ID;
INSERT INTO public.users_login(email, ID)
                Values($1, id) 
Run Code Online (Sandbox Code Playgroud)

这行得通吗?我是 postgres 的新手。

Han*_*non 6

考虑RETURNINGINSERTorUPDATE语句上使用子句来插入外键。来自PostgreSQL 文档

WITH upd AS (
  UPDATE employees 
  SET sales_count = sales_count + 1 
  WHERE id =
    (
       SELECT sales_person 
       FROM accounts 
       WHERE name = 'Acme Corporation'
    )
    RETURNING *
)
INSERT INTO employees_log 
SELECT *, current_timestamp FROM upd;
Run Code Online (Sandbox Code Playgroud)

因此,您的语句需要在 common-table-expression 中执行初始插入,它返回id以允许将其插入到users_login表中:

CREATE TABLE users (
      user_id serial
    , first_name varchar(30)
    , last_name varchar(30)
);

CREATE TABLE users_login (
      user_login_id serial
    , email varchar(30)
    , user_id int
);

WITH ins AS (
    INSERT INTO users (first_name, last_name)
                VALUES ('hannah', 'vernon') 
    
    RETURNING user_id
)
INSERT INTO users_login(email, user_id)
SELECT 'us@them.com', user_id
FROM ins
Run Code Online (Sandbox Code Playgroud)

查询两个表:

SELECT *
FROM users u
    INNER JOIN users_login ul ON u.user_id = ul.user_id;
Run Code Online (Sandbox Code Playgroud)
?????????????????????????????????????????????????????? ??????????????????????????????
? 用户身份 ?名 ?姓 ?用户登录 ID ? 电子邮件 ?用户身份 ?
?????????????????????????????????????????????????????? ??????????????????????????????
? 1 ? 汉娜?弗农?1 ? us@them.com ? 1 ?
?????????????????????????????????????????????????????? ??????????????????????????????