通过连接插入多个值

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 中做到这一点?

Erw*_*ter 7

使用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作为表名。