Como posso definir uma chave primária composta em SQL?

112

Como posso definir uma chave primária composta que consiste em dois campos no SQL?

Estou usando o PHP para criar tabelas e tudo mais. Eu quero fazer um nome de tabela votingcom campos QuestionID, MemeberIDe vote. E a chave primária composta consiste nos campos QuestionIDe MemberID.

Como devo fazer isso?

Zeeshan Rang
fonte
"E o QuestionID e o MemberID serão as chaves primárias." (QuestionID, MemberID) será a chave primária (composta) . Existe apenas uma chave e consiste em duas colunas.
Draemon de

Respostas:

229

Apenas para esclarecimento: uma tabela pode ter no máximo uma chave primária. Uma chave primária consiste em uma ou mais colunas (dessa tabela). Se uma chave primária consistir em duas ou mais colunas, é chamada de chave primária composta . É definido da seguinte forma:

CREATE TABLE voting (
  QuestionID NUMERIC,
  MemberID NUMERIC,
  PRIMARY KEY (QuestionID, MemberID)
);

O par (QuestionID, MemberID) deve ser exclusivo para a tabela e nenhum dos valores pode ser NULL. Se você fizer uma consulta como esta:

SELECT * FROM voting WHERE QuestionID = 7

ele usará o índice da chave primária. Porém, se você fizer isso:

SELECT * FROM voting WHERE MemberID = 7

não vai porque usar um índice composto requer o uso de todas as chaves da "esquerda". Se um índice está nos campos (A, B, C) e seus critérios estão em B e C, então esse índice não tem utilidade para você para essa consulta. Portanto, escolha entre (QuestionID, MemberID) e (MemberID, QuestionID) o que for mais apropriado para como você usará a tabela.

Se necessário, adicione um índice no outro:

CREATE UNIQUE INDEX idx1 ON voting (MemberID, QuestionID);
cletus
fonte
5
Boa resposta. Apenas para esclarecer, QuestionID e MemberID não são chaves primárias separadas, mas a combinação delas forma um par / tupla exclusivo.
Pedro
5
Existe uma vantagem em adicionar índice (MemberID, QuestionID), em vez de apenas MemberID? Pelo que eu entendi, você obtém pesquisa indexada ao selecionar com QuestionId, e também (QuestionId, MemeberId), de modo que a única que falta seria MemberIdapenas.
swalog
Eu sei que esta resposta é bastante antiga, mas uma vez que apareceu durante uma pesquisa no google ... Parece que há uma inconsistência no texto sobre quais colunas são usadas (ou não) para os índices padrão (es?). Além disso, ele assume que cada RDBMS criará automaticamente um índice na chave primária, mas como não é exigido por nenhum padrão, pode haver casos esquivos por aí.
Para 마 SE
Como ambos os campos são chaves simples (e provavelmente primárias) de outras tabelas, o exemplo mostra uma chave composta, não uma chave composta
guymid
6
CREATE TABLE `voting` (
  `QuestionID` int(10) unsigned NOT NULL,
  `MemberId` int(10) unsigned NOT NULL,
  `vote` int(10) unsigned NOT NULL,
  PRIMARY KEY  (`QuestionID`,`MemberId`)
);
Justin
fonte