bel*_*daz 3 postgresql join insert
我有三个表,代表两个实体和一个连接关系。每个实体关系都有一个人工代理键,用于代替自然键的外键约束。
CREATE TABLE Person (
person_id SERIAL PRIMARY KEY,
username VARCHAR NOT NULL UNIQUE
);
CREATE TABLE Group (
group_id SERIAL PRIMARY KEY,
group_name VARCHAR NOT NULL UNIQUE
);
CREATE TABLE GroupMember (
person_id INTEGER REFERENCES Person,
group_id INTEGER REFERENCES Group,
PRIMARY KEY (person_id, group_id)
);
Run Code Online (Sandbox Code Playgroud)
我想在关系中插入多个条目GroupMember
,但使用关联实体的自然键。类似的东西:
INSERT INTO GroupMember (person_id,group_id)
SELECT person_id,group_id
FROM Person P, Group G, (
('alice','girls'),
('bob','boys'),
('alice','coolkids'),
('bob','coolkids')
) AS X
WHERE P.username = X.1 AND G.group_name = X.2;
Run Code Online (Sandbox Code Playgroud)
显然,上述语法无效,但希望能传达这个想法。有没有办法在 PostgreSQL 中做到这一点?
使用VALUES
表达式生成临时表并连接到其他表以获取相应的 ID。
INSERT INTO groupmember (person_id, group_id)
SELECT p.person_id, g.group_id
FROM (
VALUES
('alice'::varchar, 'girls'::varchar)
, ('bob','boys',
, ('alice','coolkids')
, ('bob','coolkids')
) x (username, group_name)
JOIN person p USING (username)
JOIN "group" g USING (group_name);
Run Code Online (Sandbox Code Playgroud)
旁白:不要使用保留字group
作为表名。
归档时间: |
|
查看次数: |
12560 次 |
最近记录: |