Page 1 of 2

INSERT SET o INSERt VALUES

Posted: Wed Feb 11, 2015 8:44 pm
by sysctrl2
Cual es la diferencia entre.

"INSERT INTO clientes SET "
y
"INSERT INTO clientes ( field1. field2. field3) VALUES "

hablando concretamente de MySql y DOLPHIN


saludos..

Re: INSERT SET o INSERt VALUES

Posted: Wed Feb 11, 2015 11:55 pm
by horacio
Por lo que tengo entendido son dos forma de hacer un insert con resultados idénticos.

Saludos

Re: INSERT SET o INSERt VALUES

Posted: Thu Feb 12, 2015 5:45 am
by sysctrl2
gracias,
algún otro comentario ?
saludos.

Re: INSERT SET o INSERt VALUES

Posted: Thu Feb 12, 2015 10:49 pm
by Willi Quintana
Hola,,,
Sintaxis pata INSERT
INSERT INTO productos (campo1, campo2, campo3) VALUES (var1, car2, var3) WHERE <condición>
Para UPDATE
UPDATE productos SET campo1 = var1, campo2 = var2, campo3 = var3 WHERE <condición>

Re: INSERT SET o INSERt VALUES

Posted: Fri Feb 13, 2015 12:11 am
by joseluisysturiz
INSERT inserta nuevas filas en una tabla existente. Los formatos INSERT ... VALUES e INSERT ... SET, insertas filas basándose en los valores especificados explícitamente. El formato The INSERT ... SELECT inserta filas seleccionadas de otra tabla o tablas. El formato INSERT ... VALUES con una lista de múltiples valores está soportada por MySQL desde la versión 3.22.5. La sintaxis INSERT ... SET está soportada por MySQL desde la versión 3.22.10...saludos... :shock:

http://mysql.conclase.net/curso/?sqlsen=INSERT

Re: INSERT SET o INSERt VALUES

Posted: Fri Feb 13, 2015 12:17 am
by Armando
César:

Paisano, como te han mencionado es lo mismo pero no es igual (Parafraseando a Vicente Fernández) :)

A mi me agrada más la opción con SET pues me permite ver el par de campo y su correspondiente
valor a insertar.

Code: Select all

                        cCmdSql := "INSERT INTO " +;
                                            "Fijos " +;
                                        "SET " +;
                                            "Fij_Cia = '" + STR(oRsEmp:Fields("EMP_CIA"):Value,02,0) + "'," +;
                                            "Fij_Emp = '" + STR(oRsEmp:Fields("EMP_EMP"):Value,05,0) + "'," +;
                                            "Fij_Con = '" + STR(nCpto,03,0) + "'," +;
                                            "Fij_Vec    = '" + STR(nUnidad,05,2) + "'," +;
                                            "Fij_Cal = 1" + "," +;
                                            "Fij_Sdi    = '" + STR(nSdi,11,2) +"'," +;
                                            "Fij_Sdv    = '" + STR(nSdv,11,2) +"'"

 
Mientras que con la otra sintaxis se puede uno perder sobre todo cuando son muchos los pares de
campo/valor.

Cual es la mejor?, la que te acomode !.

Saludos

Re: INSERT SET o INSERt VALUES

Posted: Fri Feb 13, 2015 12:24 am
by sysctrl2
Jose Luis,
GRACIAS, MUY CLARO,

Paisa, gracias,

se me presenta el sig. caso.

Code: Select all

#include "fivewin.ch"
#include <tdolphin.ch>

#DEFINE C_SIMPLE CHR( 39 )
#DEFINE c_simple CHR( 39 )


Function Test()
    local aNombres 
    local i
    local cInsertQry := ""
    local cQry
    aadd( aNombres, {"001", "NOMBRE 1"} )
    aadd( aNombres, {"002", "NOMBRE 2"} )
    aadd( aNombres, {"003", "NOMBRE 3"} )
    aadd( aNombres, {"004", "NOMBRE 4"} )
    aadd( aNombres, {"005", "NOMBRE 5"} )
    aadd( aNombres, {"006", "NOMBRE 6"} )
    aadd( aNombres, {"007", "NOMBRE 7"} )
    aadd( aNombres, {"008", "NOMBRE 8"} )
    aadd( aNombres, {"009", "NOMBRE 9"} )
    aadd( aNombres, {"010", "NOMBRE 10"} )

    // PRIMERO TOMAR LOS VALORES
    //  PARA QUE SEA MAS RAPIDO EL CICLO FOR
       // estamos hablando de que los arreglos pueden contener desde 100 o hasta 20 mil registros

    for i := 1 to len( aNombres )
        cQry := "INSERT INTO clientes SET "
        cQry += "clave="          + ClipValue2SQL( aNombres[i][1] )  + ","
        cQry += "nombre="         + ClipValue2SQL( aNombres[i][2] )
        cInsertQry += cQry + ";"        
    NEXT

    //AQUI QUIERO AGREGAR LOS REGISTROS AL FINAL DE
    //DE RECORRER EL CICLO

    // pero NO FUNCIONA !!! mysql con dolphin
    // no marca error ni nada simplemente no inserta los 
    // registros.

    TRY
        oCon:Execute( cInsertQry )
    CATCH
    END

      // ACLARO TENGO MYSQL. 5.0  
     // GRACIAS.. SALUDOS..


return nil

Re: INSERT SET o INSERt VALUES

Posted: Fri Feb 13, 2015 12:37 am
by joseluisysturiz
sysctrl2 wrote:Jose Luis,
GRACIAS, MUY CLARO,

Paisa, gracias,

se me presenta el sig. caso.

Code: Select all

#include "fivewin.ch"
#include <tdolphin.ch>

#DEFINE C_SIMPLE CHR( 39 )
#DEFINE c_simple CHR( 39 )


Function Test()
    local aNombres 
    local i
    local cInsertQry := ""
    local cQry
    aadd( aNombres, {"001", "NOMBRE 1"} )
    aadd( aNombres, {"002", "NOMBRE 2"} )
    aadd( aNombres, {"003", "NOMBRE 3"} )
    aadd( aNombres, {"004", "NOMBRE 4"} )
    aadd( aNombres, {"005", "NOMBRE 5"} )
    aadd( aNombres, {"006", "NOMBRE 6"} )
    aadd( aNombres, {"007", "NOMBRE 7"} )
    aadd( aNombres, {"008", "NOMBRE 8"} )
    aadd( aNombres, {"009", "NOMBRE 9"} )
    aadd( aNombres, {"010", "NOMBRE 10"} )

    // PRIMERO TOMAR LOS VALORES
    //  PARA QUE SEA MAS RAPIDO EL CICLO FOR
       // estamos hablando de que los arreglos pueden contener desde 100 o hasta 20 mil registros

    for i := 1 to len( aNombres )
        cQry := "INSERT INTO clientes SET "
        cQry += "clave="          + ClipValue2SQL( aNombres[i][1] )  + ","
        cQry += "nombre="         + ClipValue2SQL( aNombres[i][2] )
        cInsertQry += cQry + ";"        
    NEXT

    //AQUI QUIERO AGREGAR LOS REGISTROS AL FINAL DE
    //DE RECORRER EL CICLO

    // pero NO FUNCIONA !!! mysql con dolphin
    // no marca error ni nada simplemente no inserta los 
    // registros.

    TRY
        oCon:Execute( cInsertQry )
    CATCH
    END

      // ACLARO TENGO MYSQL. 5.0  
     // GRACIAS.. SALUDOS..


return nil
Si quieres que grabe cada registro dentro del for..debes agregar el execute..recuerde que ese es el que te EJECUTA el comando mysql..asi lo tengo y funciona perfecto, tambien prueba quitando el ultimo ";", saludos... :shock:

Re: INSERT SET o INSERt VALUES

Posted: Fri Feb 13, 2015 3:45 am
by sysctrl2
Jose Luis,

de echo lo tengo asi, los registros los agrego dentro del FOR NEXT de uno por uno,

pero cuando son muchos elementos en el array, se hace lenta la inserción de registros

yo quiero ver si primero recorro el for next , poniendo las variables en un STRING

y al final agregarlos a la tabla,

se podrá hacer eso ?

gracias.
saludos..

Re: INSERT SET o INSERt VALUES

Posted: Fri Feb 13, 2015 4:22 am
by joseluisysturiz
Lo que seria es hacer un query como cuando se hacen respaldo de tablas y restauracion, aunque creo que al final seria casi igual, si vas hacer 2 procesos, yo te recomendaria que hicieras el insert y el execute dentro del for next, asi aseguraria la carga de los registros, igual va a tardar y cargar un array con tantos registros, te podria causar inconsistencia en los datos, has ambos metodos y calculalos con un timer haber cual te lleva menos tiempo...yo insisto en INSERT / EXECUTE dentro de FOR NEXT y podiras hasta colocar un oMeter...saludos... :shock:

Re: INSERT SET o INSERt VALUES

Posted: Fri Feb 13, 2015 4:30 am
by sysctrl2
Los registros los tomo de un archivo de texto plano,
es muy rápido el while ! oTxt:Eof()
actualmente lo hago como dices
pero pensé si habría otra forma de hacerlo mas rápido,
quizás un PROCEDURE que corra dentro del mismo server,

saludos.

Re: INSERT SET o INSERt VALUES

Posted: Fri Feb 13, 2015 4:39 am
by joseluisysturiz
Revisando he visto algo...veo que tienes el Insert dentro del for..next...eso quiere decir que va a realizar un insert por cada registro, eso haria lentitud, si quieres crear un scrip con todos los registros pero un solo Insert prueba dejando el insert fuera del for y que se concatenen los valores...algo como esto, saludos... :shock:

Code: Select all


  cQry := "INSERT INTO clientes SET "
for i := 1 to len( aNombres )
        cQry += "clave="          + ClipValue2SQL( aNombres[i][1] )  + ","
        cQry += "nombre="         + ClipValue2SQL( aNombres[i][2] )
        cInsertQry += cQry + ";"       
    NEXT

TRY
        oCon:Execute( cInsertQry )
    CATCH
    END
 

Re: INSERT SET o INSERt VALUES

Posted: Fri Feb 13, 2015 8:43 am
by fgondi
Te falta los retornos de carro.

Code: Select all

  for i := 1 to len( aNombres )
        cQry := "INSERT INTO clientes SET "
        cQry += "clave="          + ClipValue2SQL( aNombres[i][1] )  + ","
        cQry += "nombre="         + ClipValue2SQL( aNombres[i][2] )
        cInsertQry += cQry + ";" + chr(13)+chr(10)      
    NEXT
Sin ellos la cadena que quieres ejecutar quedaría así:

Code: Select all

INSERT INTO Clientes SET clave="001",nombre="NOMBRE 1";INSERT INTO clientes SET clave="02",nombre="NOMBRE 2";
Aunque no se vea el código sql a ejecutar, a mi me gusta colocarlo:

Code: Select all

  for i := 1 to len( aNombres )
        cQry := "INSERT INTO clientes SET " + chr(13)+chr(10)  
        cQry += "clave="     + ClipValue2SQL( aNombres[i][1] ) + "," + chr(13)+chr(10)  
        cQry += "nombre="  + ClipValue2SQL( aNombres[i][2] ) + ";" + chr(13)+chr(10)
        cInsertQry += cQry + chr(13)+chr(10)  
    NEXT
Igual que lo grabo en la variable, quiero que aparezca en la sentencia sql.
Además añado otro retorno de carro, entre cada instrucción insert para separlo.

El resultado sería:

Code: Select all

INSERT INTO Clientes SET 
clave="001",
nombre="NOMBRE 1";

INSERT INTO clientes SET 
clave="02",
nombre="NOMBRE 2";

Re: INSERT SET o INSERt VALUES

Posted: Fri Feb 13, 2015 9:07 am
by fgondi
En cuanto a la instrucción sql que ejecutas, desconozco si mysql funciona, pero creo que está mal escrita.

el comando "SET" se usa para actualizar los registros (UPDATE)
Para usar "INSERT INTO" tendrías estas posibilidades

Code: Select all

INSERT INTO clientes (Clave, Nombre) Values ('01', 'NOMBRE 1');
Añade un registro en tabla clientes, grabando en el campo "Clave" el valor "01" y en el campo "Nombre" el valor "NOMBRE 1"

Code: Select all

INSERT INTO clientes Values ('01', 'NOMBRE 1');
Sin especificar los valor que quieres actualizar "(Clave, Nombre)"
Añade un registro en tabla clientes y tenemos que indicar en "Values" todos _ que tenga la tabla, ordenando las columnas a incluir tal cual estén en la tabla "clientes"
En el ejemplo: La tabla clientes tendría que tener sólo 2 campos y además tendrían que estar creados con el campo "Clave" primero y "Nombre" después.
Si la tabla, cuando se creó, se incluyo primero el campo "nombre" y luego el campo "clave", daría error.

Code: Select all

INSERT INTO clientes (Clave, Nombre)
Select ... From "Otra tabla"
Where ...;
Igual que en los anteriores, añade registros a la tabla clientes, pero en este caso coge los valores de "Otra tabla".
Se puede quitar "(Clave, Nombre)", sabiendo, como comenté en el apartado anterior, que _ tendrán que estar ordenador tal cual están en la tabla "clientes".
Este método se usa cuando el registro que queremos añadir está en otra tabla, evitamos tener que pasarlo a variables para luego insertarlo en "clientes".
Además puede añadir mas de un registro. Añade todos los registros que devuelva la consulta ( Select ... From "Otra tabla" Where ... )

Re: INSERT SET o INSERt VALUES

Posted: Fri Feb 13, 2015 9:31 am
by Carlos Mora
César,

¿Y si pruebas con esto?

Code: Select all

    #include "fivewin.ch"
    #include <tdolphin.ch>

    #DEFINE C_SIMPLE CHR( 39 )
    #DEFINE c_simple CHR( 39 )


    Function Test()
        local aNombres
        local i
        local cInsertQry := ""
        local cQry
        aadd( aNombres, {"001", "NOMBRE 1"} )
        aadd( aNombres, {"002", "NOMBRE 2"} )
        aadd( aNombres, {"003", "NOMBRE 3"} )
        aadd( aNombres, {"004", "NOMBRE 4"} )
        aadd( aNombres, {"005", "NOMBRE 5"} )
        aadd( aNombres, {"006", "NOMBRE 6"} )
        aadd( aNombres, {"007", "NOMBRE 7"} )
        aadd( aNombres, {"008", "NOMBRE 8"} )
        aadd( aNombres, {"009", "NOMBRE 9"} )
        aadd( aNombres, {"010", "NOMBRE 10"} )

        // PRIMERO TOMAR LOS VALORES
        //  PARA QUE SEA MAS RAPIDO EL CICLO FOR
           // estamos hablando de que los arreglos pueden contener desde 100 o hasta 20 mil registros

         cQry := "INSERT INTO clientes (clave,nombre) VALUES  "
        for i := 1 to len( aNombres )
            cQry += "( "          + ClipValue2SQL( aNombres[i][1] )  + ","  + ClipValue2SQL( aNombres[i][2] ) + ")"
            IF i < Len( aNombres )
                cQry+= ','
        NEXT

        //AQUI QUIERO AGREGAR LOS REGISTROS AL FINAL DE
        //DE RECORRER EL CICLO

        // pero NO FUNCIONA !!! mysql con dolphin
        // no marca error ni nada simplemente no inserta los
        // registros.

        TRY
            oCon:Execute( cQry )
        CATCH
        END

          // ACLARO TENGO MYSQL. 5.0  
         // GRACIAS.. SALUDOS..


    return nil
 
con esto haces todo de un solo saque.