Eu tenho três tabelas, representando duas entidades e um relacionamento de conexão. Cada uma das relações de entidade tem uma chave substituta artificial usada para restrições de chave estrangeira no lugar de chaves naturais.
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)
);
Gostaria de inserir várias entradas na relação de relacionamento GroupMember
, mas usando as chaves naturais das entidades associadas. Algo na linha de:
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;
Obviamente, a sintaxe acima não é válida, mas esperamos transmitir a ideia. Existe uma maneira de fazer isso no PostgreSQL?
Use uma
VALUES
expressão para gerar uma tabela ad hoc e junte-se às outras tabelas para obter os respectivos IDs.Aparte: não use a palavra reservada
group
como nome da tabela.