我的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?对新创建的东西运行查询似乎是多余的。我在整个数据库中有多个这样的情况。也许我的设计一般都有缺陷?
(我显然不会存储类似的密码。)
答案 0 :(得分:2)
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。
user
是reserved word。切勿将其用作标识符。id
没用。 serial
适用于可以单独使用pk的唯一列。不需要多列pk。
引用列userdata.usr_id
也不能是序列号。使用普通integer
。
我只是使用text
代替varchar(n)
,这是可选的。 More here.
您可以考虑将两个表合并为一个......
密钥是INSERT
,UPDATE
,DELETE
可用的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列<强>参考强>: