Caso você queira ver o que tudo isso significa, aqui está um golpe por golpe:
CREATE TABLE `users_partners` (
`uid` int(11) NOT NULL DEFAULT '0',
`pid` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`uid`,`pid`),
KEY `partner_user` (`pid`,`uid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
A chave primária é baseada nas duas colunas desta tabela de referência rápida. Uma chave primária requer valores exclusivos.
Vamos começar:
INSERT INTO users_partners (uid,pid) VALUES (1,1);
...1 row(s) affected
INSERT INTO users_partners (uid,pid) VALUES (1,1);
...Error Code : 1062
...Duplicate entry '1-1' for key 'PRIMARY'
INSERT IGNORE INTO users_partners (uid,pid) VALUES (1,1);
...0 row(s) affected
INSERT INTO users_partners (uid,pid) VALUES (1,1) ON DUPLICATE KEY UPDATE uid=uid
...0 row(s) affected
observe que o acima economizou muito trabalho extra ao definir a coluna igual a si mesma, nenhuma atualização realmente necessária
REPLACE INTO users_partners (uid,pid) VALUES (1,1)
...2 row(s) affected
e agora alguns testes de várias linhas:
INSERT INTO users_partners (uid,pid) VALUES (1,1),(1,2),(1,3),(1,4)
...Error Code : 1062
...Duplicate entry '1-1' for key 'PRIMARY'
INSERT IGNORE INTO users_partners (uid,pid) VALUES (1,1),(1,2),(1,3),(1,4)
...3 row(s) affected
nenhuma outra mensagem foi gerada no console e agora possui esses 4 valores nos dados da tabela. Eu apaguei tudo, exceto (1,1), para poder testar no mesmo campo de jogo
INSERT INTO users_partners (uid,pid) VALUES (1,1),(1,2),(1,3),(1,4) ON DUPLICATE KEY UPDATE uid=uid
...3 row(s) affected
REPLACE INTO users_partners (uid,pid) VALUES (1,1),(1,2),(1,3),(1,4)
...5 row(s) affected
Então aí está. Como tudo foi realizado em uma tabela nova, quase sem dados e sem produção, os tempos de execução foram microscópicos e irrelevantes. Qualquer pessoa com dados do mundo real seria mais que bem-vinda para contribuir com eles.