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 UserData
。id
我如何获得该 ID?对刚刚创建的东西运行查询似乎是多余的。我在数据库中遇到过多次这样的情况。也许我的设计总体上有缺陷?
(我显然不会像那样存储密码。)
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)
,这是可选的。更多这里。
您可能会考虑将两个表合并为一个......
Key 是可用于、、、 立即从当前行返回值的RETURNING
子句。数据修改 CTE
的最佳用途:INSERT
UPDATE
DELETE
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)