2010-05-12 12 views

Respuesta

3

Puede insertar varias filas utilizando una sola sentencia de SQL, así:?

INSERT INTO myTable (col1, col2, col3) VALUES ('myval1', 'myval2', 'myval3'), ('myotherval1', 'myotherval2', 'myotherval3'), ('anotherval1', 'anotherval2', 'anotherval3'); 

actualización :

MarkR tiene razón en su comentario - si usted está recogiendo datos de un usuario, o si buscas la recopilación de información, se puede construir la consulta de forma dinámica con algo como:

StringBuilder stringBuilder = new StringBuilder(); 
stringBuilder.Append("INSERT INTO myTable (col1, col2, col3) VALUES "); 
for(int i=0;i<myDataCollection.Count;i++) { 
    stringBuilder.Append("(" + myDataCollection[i].Col1 + ", " + myDataCollection[i].Col2 + ", " + myDataCollection[i].Col3 + ")"); 
    if (i<myDataCollection.Count-1) { 
    stringBuilder.Append(", "); 
    } else { 
    stringBuilder.Append(";"); 
    } 
} 

string insertStatement = stringBuilder.ToString(); 

Dos puntos importantes a tener en cuenta:

  1. Si acepta entrada de un usuario, es muy importante para desinfectar todas las entradas del usuario, de lo contrario los usuarios malintencionados podrían modificar/eliminar/descenso toda tu base de datos Para obtener más información, google "SQL Injections".
  2. Uso la clase StringBuilder, en lugar de utilizar una primitiva de cadena y simplemente anexarla (es decir, cadena s = "Insertar ..."; s + = "blah blah blah") porque StringBuilder es más rápido de agregar, porque no se trata como una matriz, por lo que no necesita redimensionarse a medida que se agrega a ella.
+0

eso es bueno ... estoy aprobando el valor de mi página aspx ... no estoy dando el valor directamente ... – TinTin

+0

Puede construir la consulta programáticamente hasta el tamaño máximo de paquete (que está configurado en el servidor) – MarkR

+0

MarkR tiene razón, mira mi actualización para más información ... – AlishahNovin

1

Puede usar LOAD DATA INFILE (o LOAD DATA LOCAL INFILE) para cargar filas a granel en una tabla desde un archivo existente.

En el caso de LOAD DATA LOCAL, el archivo se transfiere del cliente al servidor y se inserta como un lote grande. Esto no está limitado por el tamaño máximo de paquete (como lo es un INSERT), pero todavía está limitado por la transacción máxima que puede retrotraer en innodb: todo va en una transacción, por lo que si es demasiado grande, excederá su retroceso espacio, y en cualquier caso, si revierte una transacción muy grande, lleva mucho tiempo e impacta el servidor.

Normalmente no es recomendable cargar más de unos pocos (decenas quizás, cientos posiblemente) megabytes de datos como una sola inserción o CARGAR DATOS. Si tienes más, puedes dividirlo.

Cuestiones relacionadas