Eu tenho uma mesa chamada provider
. Eu tenho três colunas chamadas person
, place
, thing
. Pode haver pessoas duplicadas, lugares duplicados e coisas duplicadas, mas nunca pode haver uma combinação dupada de pessoa-lugar-coisa.
Como ALTER TABLE adicionaria uma chave primária composta para esta tabela no MySQL com essas três colunas?
mysql
sql
primary-key
alter-table
composite-primary-key
David542
fonte
fonte
A resposta de @Adrian Cornish está correta. No entanto, há outra ressalva em descartar uma chave primária existente. Se essa chave primária estiver sendo usada como chave estrangeira por outra tabela, você receberá um erro ao tentar descartá-la. Em algumas versões do mysql, a mensagem de erro estava incorreta (a partir de 5.5.17, essa mensagem de erro ainda é
Se você deseja soltar uma chave primária que está sendo referenciada por outra tabela, precisará soltar a chave estrangeira nessa outra tabela primeiro. Você pode recriar essa chave estrangeira se ainda desejar depois de recriar a chave primária.
Além disso, ao usar chaves compostas, a ordem é importante. Estes
não são a mesma coisa. Ambos reforçam a exclusividade nesse conjunto de três campos, no entanto, do ponto de vista da indexação, há uma diferença. Os campos são indexados da esquerda para a direita. Por exemplo, considere as seguintes consultas:
B pode usar o índice de chave primária na instrução ALTER 1
A pode usar o índice de chave primária na instrução ALTER 2
C pode usar o índice
D não pode usar o índice
A usa os dois primeiros campos no índice 2 como um índice parcial. A não pode usar o índice 1 porque não conhece a parte intermediária do índice. Ainda pode ser capaz de usar um índice parcial em apenas uma pessoa.
D não pode usar nenhum dos índices porque não conhece pessoas.
Veja os documentos do mysql aqui para mais informações.
fonte
Você pode simplesmente querer uma restrição exclusiva. Especialmente se você já tiver uma chave substituta. (o exemplo de uma chave substituta já existente seria uma única coluna que é um AUTO_INCREMENT)
Abaixo está o código sql para uma restrição exclusiva
fonte
fonte
Definitivamente, é melhor usar a COMPOSITE UNIQUE KEY, como o @GranadaCoder ofereceu, um exemplo um pouco complicado:
ALTER IGNORE TABLE table_name ADD UNIQUES INDEX idx_name(some_id, another_id, one_more_id);
fonte
ALTER TABLE table_name DROP PRIMARY KEY,ADD PRIMARY KEY (col_name1, col_name2);
fonte