O mais próximo que posso encontrar do que quero fazer é Como duplicar linhas relacionadas , mas minha inexperiência me deixa perdido. Basicamente, quero copiar vários registros, alterar uma coluna e inseri-los de volta na mesma tabela (para que seja quase uma duplicata dos dados originais).
Menu de mesa é uma tabela de hash para um menu de comida (cada linha na tabela identificará uma categoria de menu (entrada, prato principal ou sobremesa, por exemplo) e produtos (peixe e batatas fritas).
Estrutura da tabela:
CREATE TABLE `menuship3` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`headhash` char(40) DEFAULT NULL,
`menucardhash` char(40) DEFAULT NULL,
`menucathash` char(40) DEFAULT NULL,
`producthash` char(40) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `headhash` (`headhash`)
) ENGINE=InnoDB AUTO_INCREMENT=52 DEFAULT CHARSET=utf8
Nos círculos de programação, eu diria que quero "bifurcar" meus dados...
Se o conteúdo da minha tabela fosse assim:
Eu iria | headhash | menucardhash | menucathash | produto hash |
---|---|---|---|---|
1 | aaa | aaa | aaa | aaa |
2 | aaa | aaa | aaa | bbb |
3 | aaa | aaa | aaa | ccc |
4 | aaa | aaa | bbb | ddd |
5 | aaa | aaa | ccc | eee |
6 | aaa | outro | xyz | fgi |
7 | aaa | outro | xyz | fgh |
Eu quero duplicar todos os registros com menucardhash aaa (linhas 1-5), então vou acabar com uma tabela contendo 12 registros. Os registros extras terão novo menucarhash qqq em vez de menucardhash aaa.
Eu iria | headhash | menucardhash | menucathash | produto hash |
---|---|---|---|---|
8 | aaa | qqq | aaa | aaa |
9 | aaa | qqq | aaa | bbb |
10 | aaa | qqq | aaa | ccc |
11 | aaa | qqq | bbb | ddd |
12 | aaa | qqq | ccc | eee |
O resultado significa que eu tenho registros que têm similaridade, os registros 1-5 são semelhantes aos registros 8-12 - as diferenças são as colunas id e menucardhash.
Eu ia apenas selecionar os registros dentro do PHP, alterar o menucathash e enviá-los de volta para o banco de dados, mas me perguntei se havia uma consulta SQL que poderia fazer isso por mim e, assim, reduzir a sobrecarga do ciclo da CPU.
Isso é possível por meio de uma ou duas consultas, ou é melhor que o PHP carregue o peso?
INSERT .. SELECT
Esta é uma consulta muito simples .O
id
não está incluído na lista de colunas, pois possui aAUTO_INCREMENT
propriedade e obterá valores automaticamente. Você só precisa substituir'aaa'
pelo valor menucardhash do qual deseja duplicar e'qqq'
pelo novo valor: