在多个表中添加序列值

时间:2014-05-20 15:56:03

标签: 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
);

说,我添加了一位名为INSERT INTO Users(Id, Login) VALUES(DEFAULT, 'John')的新用户,并希望在VALUES(id, 'john1980')中添加UserData,其中id是约翰的新ID。

我如何获得该ID?对新创建的东西运行查询似乎是多余的。我在整个数据库中有多个这样的情况。也许我的设计一般都有缺陷?

(我显然不会存储类似的密码。)

2 个答案:

答案 0 :(得分:2)

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
);
  • 首先阅读the manual about identifiers and key words

    • userreserved word。切勿将其用作标识符。
    • 使用描述性标识符。 id没用。
    • 避免使用大小写混合标识符。
  • serial适用于可以单独使用pk的唯一列。不需要多列pk。

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

  • 我只是使用text代替varchar(n),这是可选的。 More here.

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

2)在

中查询INSERT

密钥是INSERTUPDATEDELETE可用的RETURNING clause,可立即从当前行返回值。
最好用于data-modifying CTE

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;

答案 1 :(得分:0)

您可以考虑使用触发器。可以通过名称NEW.Id。

访问新插入行的Id列

<强>参考

  1. CREATE TRIGGER documentation on PostgreSQL Manual
  2. Trigger Procedures