跨多个表添加序列值

Mor*_*nic 2 sql postgresql database-design primary-key common-table-expression

我的 Postgres 数据库中有以下两个表:

CREATE TABLE User (
    Id       serial UNIQUE NOT NULL, 
    Login    varchar(80) UNIQUE NOT NULL,
PRIMARY KEY (Id,Login)
);

CREATE TABLE UserData (
    Id       serial PRIMARY KEY REFERENCES Users (Id),
    Password varchar(255) NOT NULL
);
Run Code Online (Sandbox Code Playgroud)

假设我添加了一个新用户,INSERT INTO Users(Id, Login) VALUES(DEFAULT, 'John')并且还想添加VALUES(id, 'john1980')John的新 ID UserDataid

我如何获得该 ID?对刚刚创建的东西运行查询似乎是多余的。我在数据库中遇到过多次这样的情况。也许我的设计总体上有缺陷?

(我显然不会像那样存储密码。)

Erw*_*ter 5

1)修正你的设计

CREATE TABLE usr (
    usr_id serial PRIMARY KEY,
   ,login  text UNIQUE NOT NULL
);

CREATE TABLE userdata (
    usr_id   int PRIMARY KEY REFERENCES usr
   ,password text NOT NULL
);
Run Code Online (Sandbox Code Playgroud)
  • 首先阅读有关标识符和关键字的手册

    • user 是一个保留字。切勿将其用作标识符。
    • 使用描述性标识符。id是没用的。
    • 避免混合大小写标识符。
  • serial适用于可以单独PK的独特列。无需多列 pk。

  • 引用也不能是userdata.usr_id序列号。使用普通的integer.

  • 我只是使用text而不是varchar(n),这是可选的。更多这里。

  • 您可能会考虑将两个表合并为一个......

2) 查询 INSERT 两者

Key 是可用于、、、 立即从当前行返回值的RETURNING子句。数据修改 CTE 的最佳用途:INSERTUPDATEDELETE

WITH ins1 AS (
   INSERT INTO usr(login)
   VALUES ('John')             -- just omit default columns
   RETURNING usr_id            -- return automatically generated usr_id
   )
INSERT INTO userdata (usr_id, password )
SELECT i.usr_id, 'john1980'
FROM   ins1 i;
Run Code Online (Sandbox Code Playgroud)