Inserindo várias linhas no mysql

349

A consulta ao banco de dados é mais rápida se eu inserir várias linhas ao mesmo tempo:

gostar

INSERT....

UNION

INSERT....

UNION

(Eu preciso inserir como 2-3000 linhas)

Emma
fonte
8
UNION é para selects.
31411 Jacob
11
Como as linhas estão chegando? Você está escrevendo diretamente SQL no MySQL Query Browser ou usando de dentro de PHP ou C # ou algo mais. Se você se encaixar nesse último caso, verifique os links a seguir: A maneira mais rápida de inserir inserções rápidas de
RKh
Corrigido segundo link: Otimizar MySQL consultas - Insere rápida com várias linhas
Pavel Shkleinik

Respostas:

1176

INSERTinstruções que usam VALUESsintaxe podem inserir várias linhas. Para fazer isso, inclua várias listas de valores de coluna, cada uma entre parênteses e separadas por vírgulas.

Exemplo:

INSERT INTO tbl_name
    (a,b,c)
VALUES
    (1,2,3),
    (4,5,6),
    (7,8,9);

Fonte

Nicola Cossu
fonte
@RPK. Eu concordo com você, mas não conheço a fonte de dados dela. Como já escrevi, se ela tiver um arquivo, eu usaria a sintaxe de carregamento de dados como sugere o cularis. :)
Nicola Cossu 31/07
também é possível usar INSERT INTO Table SELECT 1, '14/05/2012', 3 UNION SELECT 2, '05/14/2012', 3. é claro, isso só será melhor se os valores inseridos forem provenientes de tabelas diferentes.
perfil completo de Zohar Peled
72
Referência útil, porque às vezes eu esqueço a sintaxe simples.
Captain Hypertext
há a, bec aqui variáveis ​​temporárias que armazenam o conteúdo das linhas?
Lealo 15/08/19
3
@Lealo não, são os nomes das colunas da tabela nas quais os valores são inseridos na mesma ordem.
precisa saber é o seguinte
60

Se você tiver seus dados em um arquivo de texto, poderá usar LOAD DATA INFILE .

Ao carregar uma tabela de um arquivo de texto, use LOAD DATA INFILE. Isso geralmente é 20 vezes mais rápido do que usar instruções INSERT.

Otimizando Instruções INSERT

Você pode encontrar mais dicas sobre como acelerar suas instruções de inserção no link acima.

Jacob
fonte
3
E os registros duplicados?
Matteo
2
O @Matteo Duplicates será inserido ou rejeitado pelo banco de dados com base no esquema que você definiu.
Ankush981
Use multiqueries mysql
Francisco Yepes Barrera
11
Segundo link 404.
dimir
11
O link quebrado " Instruções de velocidade de inserção" agora é abordado em: Otimizando instruções INSERT .
Kenneth M. Kolano
27
BEGIN;
INSERT INTO test_b (price_sum)
  SELECT price
  FROM   test_a;
INSERT INTO test_c (price_summ) 
  SELECT price
FROM   test_a;
COMMIT;
sunilsingh
fonte
3
Isso merece mais votos, usando isso, você pode inserir em massa os dados recuperados de outras tabelas #
Novastorm
4
Se ao menos houvesse uma explicação sobre o que está acontecendo neste pedaço de código, uma vez que eu tenho que "a granel inserir dados recuperados de outras tabelas" ...
Aleister Tanek Javas Mraz
0

Aqui está uma solução PHP pronta para uso com uma tabela: m (relacionamento muitos para muitos):

// get data
$table_1 = get_table_1_rows();
$table_2_fk_id = 123;

// prepare first part of the query (before values)
$query = "INSERT INTO `table` (
   `table_1_fk_id`,
   `table_2_fk_id`,
   `insert_date`
) VALUES ";

//loop the table 1 to get all foreign keys and put it in array
foreach($table_1 as $row) {
    $query_values[] = "(".$row["table_1_pk_id"].", $table_2_fk_id, NOW())";
}

// Implode the query values array with a coma and execute the query.
$db->query($query . implode(',',$query_values));
Meloman
fonte
O uso do implode () contorna o problema do "último caractere", mas cria uma enorme sobrecarga de memória. Ela pediu 3000 linhas, imagine que cada linha tenha 1kb de dados, ou seja, 3MB de dados brutos. A matriz ocupará 30 MB de memória, ela já consome outros 30 MB do $ table_1, de modo que o script usaria 60 MB. Basta dizer, caso contrário, é uma boa solução
John
é útil para a minha situação.
Bilal Şimşek
-11
// db table name / blog_post / menu /  site_title
// Insert into Table (column names separated with comma)
$sql = "INSERT INTO product_cate (site_title, sub_title) 
  VALUES ('$site_title', '$sub_title')";

// db table name / blog_post / menu /  site_title
// Insert into Table (column names separated with comma)
$sql = "INSERT INTO menu (menu_title, sub_menu)
  VALUES ('$menu_title', '$sub_menu', )";

// db table name / blog_post /  menu /  site_title
// Insert into Table (column names separated with comma)
$sql = "INSERT INTO blog_post (post_title, post_des, post_img)
  VALUES ('$post_title ', '$post_des', '$post_img')";
Johirulla
fonte
Além da confusão dessa resposta, você também pode estar vulnerável à injeção de SQL, supondo que você esteja usando PHP.
ultrafez
2
1. Há um erro no seu código SQL. 2. O próximo valor de $ sql substituirá o valor anterior de $ sql.
Marwan Salim